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

Дано было такое задание:

Выполнить приложение командной строки с двумя параметрами , один из которых – количество потоков, другой параметр – количество выводимых строк.

Нужно так синхронизовать потоки, чтобы имена потоков выводились поочередно- в каждой строке.

Под синхронизацией подразумевается использование конструкции synchronized и методов wait, notify.

Использовать ограничения из задания 3.

Имя первого потока должно всегда выводится в новой строке.

Пример вывода для приложения с параметрами 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();
        }
 
    }
}