Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
nika-dis
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
1

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

21.03.2017, 23:32. Просмотров 728. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2017, 23:32
Ответы с готовыми решениями:

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

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

Многопоточное программирование 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...

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

1
miktim
8 / 8 / 11
Регистрация: 14.08.2016
Сообщений: 54
27.04.2017, 12:48 2
Забавная задачка. Как вариант:
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2017, 12:48

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

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

Exception in thread "main" java.lang.NoClassDefFoundError:c:HelloWorldApp/java
Exception in thread 'main' java.lang.NoClassDefFoundError:c:HelloWorldApp/java вот это выходит...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru