恢复Java中的线程

时间:2018-12-10 10:41:30

标签: java multithreading

这就是我要完成的!

第1步)启动th1并进入其可运行状态

第2步)在th1的可运行内容内启动th2

第3步,在可运行对象的中间,加入th2并转到th2的可运行对象

第4步),在th2的可运行状态中间,加入th1,然后精确返回我在th1的可运行状态中留下的位置

第5步)完成th1 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();

    }
}

输出: 一种 乙 C d Ë F 一世 G 高

“ I”应该是输出中的最后一个。我知道为什么它以不正确的顺序显示,但是,我不知道如何以正确的顺序显示它?我已经一起使用notify()和wait()。如果我在“ alphabet2”中键入“ th1.start()”,则在“ alphabet”类之后将重新启动并显示“ A”。我也尝试过“ interrupt()”和“ sleep()”。我了解我的代码有缺陷,我仅以代码为例。

1 个答案:

答案 0 :(得分:0)

这是基于您的代码的可能解决方案。

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");
        }
    }
}