Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6

Многопоточное приложение на Java (Java Thread)

21.03.2017, 23:32. Показов 1696. Ответов 1

Студворк — интернет-сервис помощи студентам
Дано было такое задание:
Выполнить приложение командной строки с двумя параметрами , один из которых – количество потоков, другой параметр – количество выводимых строк.
Нужно так синхронизовать потоки, чтобы имена потоков выводились поочередно- в каждой строке.
Под синхронизацией подразумевается использование конструкции synchronized и методов wait, notify.
Использовать ограничения из задания 3. (нельзя использовать флаги, sleep и тому подобное)
Имя первого потока должно всегда выводится в новой строке.

Пример вывода для приложения с параметрами 3 и 2:
Thread-0 Thread-1 Thread-2
Thread-0 Thread-1 Thread-2

Вот, что мне пришло в голову, но к сожалению, это пока работает неверно( а как исправить, тоже не ясно
Возможно, executer лишний, но в процессе написания возникла проблема, которую смогла решить только таким образом
Если есть идеи, как сделать, чтобы это все заработало без мониторов и других дополнений, буду очень рада


Main

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
49
50
51
52
53
public class Main {
    public static int countOfLines = 0;
    public static int countOfThreads = 0;
    public static Executer executer;
    public static MyThread[] threads;
 
    static void checkArguments(String[] args) {
        if (args.length != 2) {
            Logger.getLogger("Looger").log(new LogRecord(Level.WARNING, "ILLEGAL ARGUMENTS"));
            System.exit(1);
        }
    }
 
    static void parseArgument(String[] args) {
        countOfLines = new Integer(args[1]);
        countOfThreads = new Integer(args[0]);
    }
 
    static void createAllThreads() {
 
        threads = new MyThread[countOfThreads];
        for (int i = 0; i < (countOfThreads); ++i) {
            threads[i] = new MyThread();
            threads[i].setDaemon(true);
        }
    }
 
    static void makeDependencies() {
        for (int i = 0; i < (countOfThreads - 1); ++i) {
            threads[i].addDependence(threads[i + 1]);
        }
        threads[countOfThreads - 1].addDependence(executer);
    }
 
    static void startThreads(){
        for (int i = 0; i < (countOfThreads); ++i) {
            threads[i].start();
        }
    }
 
    public static void main(String[] args) {
        checkArguments(args);
        parseArgument(args);
        createAllThreads();
 
        executer  = new Executer(countOfLines,threads);
 
        makeDependencies();
        startThreads();
 
        executer.start();
    }
}
MyThread
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
public class MyThread extends Thread {
 
    private static MyThread nextThread;
 
    public static void addDependence(MyThread n) {
        nextThread = n;
    }
 
    @Override
    public void run() {
        while (true) {
            //Wait();
            System.out.print(Thread.currentThread().getName() + " ");
            synchronized (nextThread) {
                nextThread.notify();
            }
            Wait();
        }
    }
 
    public void Wait() {
        try {
            synchronized (this) {
                wait();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Executer
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Executer extends MyThread{
    public static int countOfLines = 0;
    public static MyThread[] threads;
 
    public Executer(int c, MyThread t[]){
        threads = t;
        countOfLines = c;
    }
 
    @Override
    public void run(){
        for (int k = 0; k < countOfLines; ++k) {
            System.out.print("\n");
            synchronized (threads[0]) {
                threads[0].notify();
            }
            Wait();
        }
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2017, 23:32
Ответы с готовыми решениями:

Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent
Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent. Не использовать слово...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая запись, ...

Чтение теста из файлов в Java. java коллекции, потоки. создать приложение, в котором будет два отдельных потока
Создайте два текстовых файла с именами, например, countries.txt и capitals.txt. В первом файле должны быть перечислены названия стран,...

1
12 / 11 / 12
Регистрация: 14.08.2016
Сообщений: 80
27.04.2017, 12:48
Забавная задачка. Как вариант:
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
49
50
51
52
53
54
55
56
57
58
59
60
import java.lang.Thread;
import java.lang.Thread.State;
 
class FunnyCarousel {
 
  public static void main(String[] args) throws InterruptedException{
    int threads = 1;
    if (args.length > 0) threads = Integer.parseInt(args[0]);
    int lines = 1;
    if (args.length > 1) lines = Integer.parseInt(args[1]);
    if (threads > 0 && lines > 0) {
      FunnyCarousel fc =  new FunnyCarousel(threads, lines);
    }
  }
// JVM ждет завершения инициированных потоков
 
  FunnyCarousel(int n, int l) {
// организуем карусель 
    NextThread first = new NextThread(0,l);
    NextThread prev = first;
    NextThread next = first;
    for (int i = 1; i < n; i++) {
      next = new NextThread(i,l); 
      prev.next = next;
      prev = next;
    }
    next.next = first;
    first.start();   // стартуем карусель
   }
 
  class NextThread extends Thread {
    int number;      // номер потока
    int lines;       // строк
    NextThread next; // следующий поток, заодно объект синхронизации
 
    NextThread(int n, int l) {
      number = n;
      lines = l;
    }
    public void run() {
      NextThread current = (NextThread) Thread.currentThread();
      for (; lines > 0; lines--) {
        System.out.print( current.getName() + (next.number == 0 ? "\n" : " ") );
        if (next.equals(current)) continue; // всего один поток!
        try {
          if ( next.getState() == Thread.State.WAITING ) {   // следующий ждет?
            synchronized (next.next) { next.next.notify(); } // толкнем его
          } else {
            next.start(); // не ждет - стартуем
          }
          synchronized (next) { next.wait(); } // впадаем в спячку
        } catch (Exception e) {
// ...и тут что-то пошло не так...(IllegalThreadStateException)
          e.printStackTrace();
          System.exit(1);
        }
      }
    }
  }
}
Добавлено через 21 час 42 минуты
Вопрос сообществу:
почему предложенный код карусели работает, поскольку должна сложиться ситуация:
Main(TERMINATED) - Thread-0(TERMINATED) - Thread-1(WAITING) .... Thread-n(WAITING)
и jvm должна "зависнуть" ожидая завершения приостановленных потоков 1...n, не являющихся демонами?

Компилировалось:
javac 1.6.0_26
javac 1.7.0_121

Запускалось:
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
Java HotSpot(TM) Client VM (build 25.31-b07, mixed mode).

Добавлено через 21 час 50 минут
По предыдущему замечанию: баг JVM. Исправлено в свежих релизах java.

Поправки к коду карусели:
либо
объявить потоки 1...n демонами на этапе создания: next.setDaemon(true);
либо заменить тело try:
Java
1
2
3
4
5
6
7
8
9
          if ( next.getState() == Thread.State.NEW ) {   // следующий еще не запущен?
            next.start(); // стартуем
          } 
          if ( next.getState() == Thread.State.WAITING ) {   // следующий ждет?
            synchronized (next.next) { next.next.notify(); } // толкнем его
          } 
          if (lines > 1) {
            synchronized (next) { next.wait(); } // впадаем в спячку
          }
Забавная задачка...

Добавлено через 3 часа 39 минут
Ух, как все непросто. Копать матчасть придется глубоко.
Дело (включая "зависание" jvm) не в версии java, а в среде исполнения: числе ядер процессора, типе, производительности, ???
Вторая поправка не универсальна. Первая - работает в известных мне ситуациях.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2017, 12:48
Помогаю со студенческими работами здесь

Многопоточное программирование JAVA
Здравствуйте. Необходимо просуммировать элементы матрицы двумя способами -- используя потоки и без них, сравнить результаты и убедиться,...

Ошибка Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at pr4.RSA.main(RSA.java:44)
package pr4; import java.math.BigInteger; import java.security.SecureRandom; public class RSA { private final...

Java thread
Хорошо, я создал сокет класса, является телефонный оператор, клиент отправляет номер на сервер, и он говорит, сколько он должен заплатить,...

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at work.WorkClass.main(WorkClass.java:16)
Здравствуйте. Объясните, что не так. package test; public class Test { public static void main(String args) { String...

Ошибка Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at program.main(program.java:25)
Всем привет, только начал изучать java, помогите исправить ошибку в заголовке, и если не сложно, скажите, как можно уменьшить текст...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru