Возобновление потоков в java

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

шаг 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();

    }
}

ВЫВОД: А B C D E F я г ЧАС

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

В чем вопрос?

m0skit0 10.12.2018 11:50

Как распечатать алфавиты по порядку

ezg 10.12.2018 11:57
System.out.println("A B C D E F G H I");
m0skit0 10.12.2018 12:07

Да, я мог бы сделать это одной строкой, но дело в том, чтобы сделать это с разделением определенных алфавитов. Как я могу изменить его порядок с помощью потоков?

ezg 10.12.2018 12:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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");
        }
    }
}

Спасибо! Я очень ценю это! Это идеально! К сожалению, я не могу проголосовать, но вы отлично поработали!

ezg 10.12.2018 12:42

@ezg Но вы понимаете, почему и как это работает, и почему у вас не работает? Копирование его в домашнее задание - всего лишь временное решение ...

m0skit0 10.12.2018 12:43

Нет, не знаю. Но мне придется это исследовать. Это не совсем моя домашняя работа, в любом случае это больше для меня.

ezg 10.12.2018 16:24

@ezg - вы может принимаете ответы, которые лучше всего отвечают на ваш вопрос

Krease 11.12.2018 00:58

@ezg Если вы чего-то не понимаете, не стесняйтесь спрашивать. И, как указал креасе, вы можете принять ответ.

m0skit0 11.12.2018 13:16

Другие вопросы по теме