Это то, чего я хочу добиться!

Шаг 1) Запустите th1 и перейдите к его запуску

Шаг 2) запустите th2 внутри исполняемого th1

Шаг 3) в середине runnable присоединитесь к th2 и перейдите к runnable th2

Шаг 4) в середине runnable th2, присоединитесь к th1 и вернитесь туда, где я оставил в th1 runnable

Шаг 5) после завершения th1 runnable вернитесь к th2 runnable именно там, где я оставил, и закончите th2 runnable

Шаг 6) программа завершается

Шаги 4 и 5 - моя проблема. Я не могу их правильно выполнить.

public class Threads2 {
    class alphabet1 implements Runnable {

        @Override
        public void run() {

            alphabet2 alpha2= new alphabet2();
            Thread th2 = new Thread(alpha2);
            System.out.println("A");
            System.out.println("B");
            System.out.println("C");
            System.out.println("D");

            th2.start();
            try {
                th2.join();
            }catch (InterruptedException e) {
            }catch (IllegalMonitorStateException e1){
                System.out.println("Thread interrupted!");
            }

            System.out.println("G");
            System.out.println("H");
        }
    }
    class alphabet2 implements Runnable {

        @Override
        public void run() {

            alphabet alpha= new alphabet();
            Thread th1 = new Thread(alpha);
            System.out.println("E");
            System.out.println("F");

            try {
                th1.join();
            }catch (InterruptedException e){
            }catch (IllegalMonitorStateException e1){
                System.out.println("Thread interrupted!");
            }

            System.out.println("I");

        }
    }

    public static void main(String[] args){
        Threads2 obj = new Threads2();

        alphabet1 alpha  = obj.new alphabet1(); 

        Thread th1 = new Thread(alpha);
        th1.start();

    }
}

ВЫХОД: A B C D E F I G H

«I» должно быть последним в выводе. Я знаю, почему он отображается в неправильном порядке, однако я не могу понять, как отобразить его в правильном порядке? Я использовал notify () и wait () вместе. Если я наберу «th1.start ()» внутри «алфавита2», то после «алфавита» класс перезапустится с печатью «А». Я также пробовал "прерывание ()" и "сон ()". Я понимаю, что в моем коде есть недостатки, я просто использую этот код в качестве примера.

-1
ezg 10 Дек 2018 в 13:41

1 ответ

Лучший ответ

Это возможное решение, основанное на вашем коде.

public class Main {

    private static final Object LOCK = new Object();

    public static void main(String[] args) {
        alphabet1 alpha = new alphabet1();
        new Thread(alpha).start();
    }

    static class alphabet1 implements Runnable {

        @Override
        public void run() {

            System.out.println("A");
            System.out.println("B");
            System.out.println("C");
            System.out.println("D");

            try {
                synchronized (LOCK) {
                    alphabet2 alpha2 = new alphabet2();
                    new Thread(alpha2).start();
                    LOCK.wait();
                }
            } catch (InterruptedException | IllegalMonitorStateException e) {
                e.printStackTrace();
            }

            System.out.println("G");
            System.out.println("H");

            try {
                synchronized (LOCK) {
                    LOCK.notifyAll();
                }
            } catch (IllegalMonitorStateException e) {
                e.printStackTrace();
            }
        }
    }

    static class alphabet2 implements Runnable {

        @Override
        public void run() {

            System.out.println("E");
            System.out.println("F");

            try {
                synchronized (LOCK) {
                    LOCK.notifyAll();
                    LOCK.wait();
                }
            } catch (InterruptedException | IllegalMonitorStateException e) {
                e.printStackTrace();
            }

            System.out.println("I");
        }
    }
}
1
m0skit0 10 Дек 2018 в 11:32