Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
33 / 25 / 11
Регистрация: 11.10.2019
Сообщений: 162

Не могу разобраться с тем, как правильно написать тест на многопоточность

11.02.2021, 19:34. Показов 2236. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго дня.

В общем ситуация такая: разбираюсь с многопоточностью в нативной Java.
Нашел т.н. задачник, взял первое задание и тут понял что не до конца понимаю что от "меня" хотят.

В общем надо дописать логику класса (приведен ниже), которая бы позволяла запускать его методы в строгом порядке, т.е. по очереди, начиная с первого, вне зависимости от того, в каком порядке они будут вызваны.
Я бы приложил ссылку на оригинальное описание задачи, т.к. возможно не сумел объяснить что требуется, но не знаю как отнесутся к этому модераторы.

Начальный класс/задача:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Foo {
 
    public Foo() {
        
    }
 
    public void first(Runnable printFirst) throws InterruptedException {
        
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
    }
 
    public void second(Runnable printSecond) throws InterruptedException {
        
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
    }
 
    public void third(Runnable printThird) throws InterruptedException {
        
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
    }
}


Самое простое решение (из интернета):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Foo {
    private int threadNumber;
 
    public Foo() {
        threadNumber = 1;
    }
 
    synchronized public void first(Runnable printFirst) throws InterruptedException {
        while (threadNumber != 1) {
            wait();
        }
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
        threadNumber++;
        notifyAll();
    }
 
    synchronized public void second(Runnable printSecond) throws InterruptedException {
        while (threadNumber != 2) {
            wait();
        }
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
        threadNumber++;
        notifyAll();
    }
 
    synchronized public void third(Runnable printThird) throws InterruptedException {
        while (threadNumber != 3) {
            wait();
        }
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
        threadNumber++;
        notifyAll();
    }
 
}


Собственно вопрос, как написать тест для проверки данной логики?

Пробовал так:

1) Создал 3 Runnable класса A, B и C, которые бы принимались как параметры для каждого метода:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
public class A implements Runnable {
 
    @Override
    public void run() {
        System.out.print("first");
    }
 
}
 
***

2) Затем создал тестовый класс, который работает, но только если вызовы методов идут в правильном порядке, в противном случае вызываемый метод wait() в классе Foo не дает продолжать выполнять команды, что собственно логично:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
public class FooTest {
 
    public static void main(String[] args) throws InterruptedException {
        Foo foo = new Foo();
 
        foo.first(new Thread(new A()));
        foo.second(new Thread(new B()));
        foo.third(new Thread(new C()));
    }
 
}


В общем - запутался)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2021, 19:34
Ответы с готовыми решениями:

Не могу разобраться с тем, как делать поэлементный перебор символов строки, изменяя значение указателя
Нужно написать такую программу, которая Даны два предложения. Напечатать те слова из первого, которые входят и во второе предложение. При...

Не могу разобраться с тем, как парсить json: response.json as?
не могу разобраться с тем как парсить json response.json as? предполагаю что проблема в том что я неправильно составляю то что...

Как правильно написать тест на ошибки?
Почему у меня выводится вот так, а не так как надо? http://s05.***********/i178/1212/d8/4804029627b7.jpg int main(int j) { ...

6
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
11.02.2021, 19:47
Цитата Сообщение от Hamster83 Посмотреть сообщение
Я бы приложил ссылку на оригинальное описание задачи
нормально отнесутся, я думаю, прикладывай.
1
33 / 25 / 11
Регистрация: 11.10.2019
Сообщений: 162
11.02.2021, 22:49  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
нормально отнесутся, я думаю, прикладывай.
Leetcode->Problemset->Concurrency->Print-in-order

Добавлено через 52 минуты
Кажется разобрался)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class FooTest {
 
    public static void main(String[] args) {
        int[] methodCallOrder = {2, 1, 3};
        test(methodCallOrder);
    }
 
    private static void test(int[] methodCallOrder) {
        Thread[] threads = new Thread[3];
 
        Foo foo = new Foo();
        for (int i = 0; i < methodCallOrder.length; i++) {
            threads[i] = new MyThread(methodCallOrder[i], foo);
        }
        Arrays.asList(threads).forEach(Thread::start);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MyThread extends Thread {
    private final int methodIndex;
    private final Foo foo;
 
    public MyThread(int methodIndex, Foo foo) {
        this.methodIndex = methodIndex;
        this.foo = foo;
    }
 
    @Override
    public void run() {
        try {
            if (methodIndex == 1) {
                foo.first(() -> System.out.print("first"));
            } else if (methodIndex == 2) {
                foo.second(() -> System.out.print("second"));
            } else if (methodIndex == 3) {
                foo.third(() -> System.out.print("third"));
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
12.02.2021, 12:00
Лучший ответ Сообщение было отмечено Hamster83 как решение

Решение

Hamster83, или так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Sol {
    public static void main(String[] args) {
        new Foo(new int[]{3,1,2}).launcher();
        System.out.println("===");
        new Foo(new int[]{3,1}).launcher();
    }
}
 
class Foo {
    private String[] orderName = {"first","second","third"};
    private int[] schedulerLaunch;
 
    Foo(int[] schedulerLaunch) {
        this.schedulerLaunch = schedulerLaunch;
    }
 
    public void launcher() {
        if (schedulerLaunch.length > 3) throw new IllegalArgumentException("Order launch is bad!");
        Thread[] myThreads = new Thread[schedulerLaunch.length];
        for (int i = 0; i < schedulerLaunch.length ; i++) {
            String tmpName = orderName[schedulerLaunch[i] - 1];
            if ("first".equals(tmpName)) myThreads[i] = first();
            else if ("second".equals(tmpName)) myThreads[i] = second();
            else if ("third".equals(tmpName)) myThreads[i] = third();
        }
        for (Thread aMyTher : myThreads) aMyTher.start();
        try {
            for (Thread aMyTher : myThreads) aMyTher.join();
        }catch (InterruptedException ignored) {/*NOP*/}
    }
 
    public Thread first() {
        return new Thread(new MyRun(), "First");
    }
    public Thread second() {
        return new Thread(new MyRun(), "Second");
    }
    public Thread third() {
        return new Thread(new MyRun(), "Third");
    }
}
 
class MyRun implements Runnable {
    @Override
    public void run() {
        System.out.print(Thread.currentThread().getName());
    }
}
0
33 / 25 / 11
Регистрация: 11.10.2019
Сообщений: 162
12.02.2021, 13:44  [ТС]
Aviz__, Вот еще один вариант запуска теста без использования дополнительных классов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class FooTest {
 
    public static void main(String[] args) {
        test(new int[]{3, 1, 2});
    }
 
    private static void test(int[] methodCallOrder) {
        Map<Integer, Runnable> runnableMap = new HashMap<>();
        Foo foo = new Foo();
 
        runnableMap.put(1, () -> {
            try {
                foo.first(() -> System.out.print("first"));
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        });
 
        runnableMap.put(2, () -> {
            try {
                foo.second(() -> System.out.print("second"));
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        });
 
        runnableMap.put(3, () -> {
            try {
                foo.third(() -> System.out.print("third"));
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        });
 
        Arrays.stream(methodCallOrder).forEach(i -> new Thread(runnableMap.get(i)).start());
    }
 
}
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
12.02.2021, 13:54
Цитата Сообщение от Hamster83 Посмотреть сообщение
теста без использования дополнительных классов
но с коллекциями)).
0
33 / 25 / 11
Регистрация: 11.10.2019
Сообщений: 162
12.02.2021, 15:12  [ТС]
Aviz__, Без коллекций) Это будет моей крайней версией данной функциональности.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class FooTest {
 
    public static void main(String[] args) {
        test(new int[]{3, 1, 2});
    }
 
    private static void test(int[] methodCallOrder) {
        Foo foo = new Foo();
 
        for (int methodIndex : methodCallOrder) {
            new Thread(() -> {
                try {
                    if (methodIndex == 1) {
                        foo.first(() -> System.out.print("first"));
                    } else if (methodIndex == 2) {
                        foo.second(() -> System.out.print("second"));
                    } else if (methodIndex == 3) {
                        foo.third(() -> System.out.print("third"));
                    }
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }).start();
        }
    }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2021, 15:12
Помогаю со студенческими работами здесь

Не могу разобраться как правильно сконструировать сеть
Здравствуйте. Помогите, пожалуйста, начинающему разобраться как правильно сконструировать сеть! Python, Keras. --------- По порядку: ...

Ошибка. Не могу разобраться как js и html связать правильно
Доброго времени суток всем. Можете ли вы указать чайнику на ошибки? &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; ...

Header(location) не могу разобраться как перейти правильно
case ('add_to_cart') : $id=$_GET; $add_item=add_to_cart($id); $_SESSION=total_items($_SESSION); ...

Не могу разобраться с OpenMP! Как правильно распараллелить формулу?
Только начинаю изучать ПП. Помогите разобраться как распараллелить формулу. Данные зависимы. Не могли бы показать на данном примере как...

Как сделать правильно список из списков объектов? Не могу правильно код написать
Нужно импортировать из csv данные о файлов, поместить в список, причем в него нужно помещать подсписки с файлами, у которых одинаковое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru