Java 等待总是需要通知才能工作吗?

Java 等待总是需要通知才能工作吗?,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,直到现在我才意识到等待总是需要通知才能正常工作。但是当我尝试下面的代码时,我对等待和通知的工作有点困惑。我创建了三个线程t1、t2、t3,并分别通过了可运行的t1、t2和t3。据我所知,在启动这三个线程时,只有t1应该打印,t2和t3应该进入等待状态并继续等待,因为没有人通知 但是o/p对我来说是不可预测的。有人能帮我解释一下吗。下面是我的课程 package com.vikash.Threading; class T1 implements Runnable { private S

直到现在我才意识到等待总是需要通知才能正常工作。但是当我尝试下面的代码时,我对等待和通知的工作有点困惑。我创建了三个线程t1、t2、t3,并分别通过了可运行的t1、t2和t3。据我所知,在启动这三个线程时,只有t1应该打印,t2和t3应该进入等待状态并继续等待,因为没有人通知

但是o/p对我来说是不可预测的。有人能帮我解释一下吗。下面是我的课程

package com.vikash.Threading;

class T1 implements Runnable {

    private State state;

    public T1(State state) {
        this.state=state;
    }

    @Override
    public void run() {

        synchronized (state) {
            while(state.getState()!=1) {
                try {
                    state.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            synchronized (state) {
                System.out.println(Thread.currentThread().getName());
                state.setState(2);
            }
        }
    }
}

class T2 implements Runnable {

    private State state;

    public T2(State state) {
        this.state=state;
    }

    @Override
    public void run() {

        synchronized (state) {
            while(state.getState()!=2) {
                try {
                    state.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            synchronized (state) {
                System.out.println(Thread.currentThread().getName());
                state.setState(3);
            }
        }
    }
}

class T3 implements Runnable {

    private State state;

    public T3(State state) {
        this.state=state;
    }

    @Override
    public void run() {

        synchronized (state) {
            while(state.getState()!=3) {
                try {
                    state.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            synchronized (state) {
                System.out.println(Thread.currentThread().getName());
                state.setState(1);
            }
        }
    }
}

public class Sequence {

    public static void main(String[] args) {

        State state=new State();
        Thread t1=new Thread(new T1(state),"First");
        Thread t2=new Thread(new T2(state),"Second");
        Thread t3=new Thread(new T3(state),"Third");
        t1.start();
        t2.start();
        t3.start();
    }
}



package com.vikash.Threading;

public class State {

    private int state=1;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }
}

根据评论,我正在修改我的问题。o/p有时我得到的是第一秒,它不会终止,有时是第一秒到第三秒,然后终止。

您的期望是不正确的,您的所有线程都可能在当前编写程序时打印并结束(但这取决于随机机会)

这取决于哪个线程首先使用所有线程都具有的
同步
块在
状态
上抓取监视器

考虑这个流程:

  • T1首先进入
    synchronized(状态)
    块。T2和T3正在等待进入其
    已同步(状态)
  • T1不作为
    状态等待。getState()==1
    ,因此改为
  • T1打印线程名称并将2分配给
    state.state
  • T1退出同步块
  • T2或T3输入它们的
    synchronized(state)
    块,假设它是T2(首先输入的是Java中未定义的行为,很可能是随机的)
  • 因此T2不会作为
    state.getState()==2等待
  • T2打印线程名称并将3分配给
    state.state
  • T2退出同步块
  • T3进入同步块,不等待,并打印线程名称
  • 程序完成了

  • 您的期望是不正确的,您的所有线程都可能在当前编写程序时打印并结束(但这取决于随机机会)

    这取决于哪个线程首先使用所有线程都具有的
    同步
    块在
    状态
    上抓取监视器

    考虑这个流程:

  • T1首先进入
    synchronized(状态)
    块。T2和T3正在等待进入其
    已同步(状态)
  • T1不作为
    状态等待。getState()==1
    ,因此改为
  • T1打印线程名称并将2分配给
    state.state
  • T1退出同步块
  • T2或T3输入它们的
    synchronized(state)
    块,假设它是T2(首先输入的是Java中未定义的行为,很可能是随机的)
  • 因此T2不会作为
    state.getState()==2等待
  • T2打印线程名称并将3分配给
    state.state
  • T2退出同步块
  • T3进入同步块,不等待,并打印线程名称
  • 程序完成了

  • 请解释,但o/p对Memy不可预测可能不是原因,但您是否意识到您已嵌套
    已同步
    请解释,但o/p对Memy不可预测可能不是原因,但您是否意识到您已嵌套
    已同步
    请参见