Синхронизация потоков джава

248
29 августа 2018, 06:10

Подскажите пожалуйста где я допустил ошибку, подразумевался последовательный вывод всех пунктов, согласно номеров

public class MainClass {
    public static void main(String[] args) throws InterruptedException {
        ThreadA threadA = new ThreadA();
        ThreadB threadB = new ThreadB();
        threadA.setThreadB(threadB);
        threadB.setThreadA(threadA);
        threadA.start();
        threadB.start();
    }
}
class ThreadA extends Thread{
    private Thread threadB;
    public void setThreadB(ThreadB threadB) {
        this.threadB = threadB;
    }
    @Override
    public void run() {
        synchronized (threadB) {
            try {
                synchronized (this){
                    System.out.println("1.Получили заказ\n");
                    wait();
                    threadB.notify();
                    System.out.println("3.Обдумали план действий\n");
                    wait();
                    threadB.notify();
                    System.out.println("5.Проконтролировали корректное выполнеие\n");
                    wait();
                    threadB.notify();
                    System.out.println("7.Получили деньги\n");
                    wait();
                    threadB.notify();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class ThreadB extends Thread{
    private Thread threadA;
    public void setThreadA(ThreadA threadA) {
        this.threadA = threadA;
    }
    @Override
    public void run() {
        synchronized (threadA){
            synchronized (this){
                try {
                    wait();
                    System.out.println("2.Состававили ТЗ\n");
                    threadA.notify();
                    wait();
                    System.out.println("4.Наняли работяг\n");
                    threadA.notify();
                    wait();
                    System.out.println("6.Сдали работу\n");
                    threadA.notify();
                    wait();
                    System.out.println("8.Пошли отмечать\n");
                    threadA.notify();
                }
                catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

Выводит только следующее: 1.Получили заказ

Answer 1

import sun.awt.windows.ThemeReader; 
 
import java.util.Date; 
import java.util.Locale; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReadWriteLock; 
import java.util.concurrent.locks.ReentrantReadWriteLock; 
 
public class MainClass { 
    public static void main(String[] args) throws InterruptedException { 
        ForSyncron forSyncron = new ForSyncron(); 
        forSyncron.setI(0); 
 
        ThreadA threadA = new ThreadA(); 
        ThreadB threadB = new ThreadB(); 
        threadA.setForSyncron(forSyncron); 
        threadB.setForSyncron(forSyncron); 
 
        threadA.start(); 
        Thread.sleep(10); 
        threadB.start(); 
    } 
} 
 
class ForSyncron{ 
    private int i; 
 
    public void setI(int i) { 
        this.i = i; 
    } 
    public int getI() { 
        return i; 
    } 
} 
 
class ThreadA extends Thread{ 
    private ForSyncron forSyncron; 
    public void setForSyncron(ForSyncron forSyncron) { 
        this.forSyncron = forSyncron; 
    } 
 
    @Override 
    public void run() { 
        try { 
            synchronized (forSyncron){ 
                System.out.println("1.Получили заказ\n"); 
                forSyncron.wait(); 
 
                System.out.println("3.Обдумали план действий\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
                System.out.println("5.Проконтролировали корректное выполнеие\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
                System.out.println("7.Получили деньги\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
            } 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
    } 
} 
 
class ThreadB extends Thread{ 
    private ForSyncron forSyncron; 
    public void setForSyncron(ForSyncron forSyncron) { 
        this.forSyncron = forSyncron; 
    } 
 
 
    @Override 
    public void run() { 
        synchronized (forSyncron){ 
            try { 
                System.out.println("2.Состававили ТЗ\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
                System.out.println("4.Наняли работяг\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
                System.out.println("6.Сдали работу\n"); 
                forSyncron.notify(); 
                forSyncron.wait(); 
 
                System.out.println("8.Пошли отмечать\n"); 
            } 
            catch (Exception e){ 
                e.printStackTrace(); 
            } 
        } 
    } 
 
} 
 
//создать связующий объект, + на нем потестить вызов синхрон методов

READ ALSO
вызов одного fxml с разными параметрами

вызов одного fxml с разными параметрами

имеется некий TabPane с несколькими табами естественно (все, за день, за неделю) внутри табов идентичная таблица по структуре но уже с разными...

162
Формат даты c таймзоной Java

Формат даты c таймзоной Java

есть Timestamp и формат вывода даты "EEEE, MMM dd, yyyy hh:mm a zzz", но как вывести эту дату правильной (тоесть ту что в timestamp) вместе с таймзоной? Как бы я не делал,...

166
Можно ли нарисовать границу CSS?

Можно ли нарисовать границу CSS?

К примеру необходимо что б граница у элемента (блок, кнопка) были в виде звезды, зайчика или другой произвольно нарисованной границыМожно...

198