java多线程中的wait函数

java多线程中的wait函数,java,multithreading,Java,Multithreading,这段代码如何工作: boolean flag=true; while(flag){ wait(); flag=!flag; } 会旗=!你曾经被处决过吗?此外,如果将标志设置为静态变量(在实例之间共享),并启动包含以下代码的两个线程: for(int i=0;i<5;i++){ flag=!flag; while(flag){ System.out.println("*"); wait(); } notify()

这段代码如何工作:

boolean flag=true;
while(flag){
    wait();
    flag=!flag;
}
会旗=!你曾经被处决过吗?此外,如果将标志设置为静态变量(在实例之间共享),并启动包含以下代码的两个线程:

for(int i=0;i<5;i++){
 flag=!flag;   
 while(flag){
        System.out.println("*");
        wait();
    } 
    notify();
}
for(int i=0;i
.wait()表示“我的时间片用完了。在有人调用notify()之前,不要再给我另一个时间片。”除非有人调用notify()(或出现其他几种唤醒场景之一),否则操作系统甚至不会尝试安排您的任务

是否会执行标志=!标志

是的,在线被唤醒之后

此外,如果将flag设置为静态变量并启动两个包含以下代码的线程:

for(int i=0;i<5;i++){
 flag=!flag;   
 while(flag){
        System.out.println("*");
        wait();
    } 
    notify();
}
标记为静态意味着它在实例之间共享,对吗

假设标志开始时为true

  • 你一年产生一个线程
  • 生成另一个线程B。线程在随机延迟后开始运行
  • A将标志从false设置为true。A开始运行循环。A等待直到再次唤醒
  • 在某个点B开始运行。当它这样做时,它将标志设置为false。B直接进入notify();它唯一通知的是它自己
  • A继续等待notify(),B已终止
  • 如果在某个时刻通知,它将在循环中继续,看到该标志不再为true,然后继续并终止
是否会执行标志=!标志

是。如果另一个线程在此对象上调用
notify()
notifyAll()
,则
wait()
调用将返回并清除
标志,从而导致循环退出

为什么程序在打印随机数的“*”后停止

如果代码确实如所述,则只应打印两个
*
,因为线程在
wait()
调用时不能调用
notify()
,并且没有显示调用
notify()
的其他线程


请将伪代码替换为

以下是完整的实现:

class Test implements Runnable{
    static boolean flag=false;
    public static void main(String[] args){
        new Thread(this,"thread1").start();
        new Thread(this,"thread2").start();
    }
    public void run(){
        for(int i=0;i<5;i++){
            flag=!flag;
             try{
                while(flag){
                System.out.println("*");
                wait();
                }
            }catch(InterruptedException e){
                System.out.println("thread interrupted");
            }
            notify();
        }
    }
}
类测试实现可运行{
静态布尔标志=false;
公共静态void main(字符串[]args){
新线程(此“thread1”).start();
新线程(此“thread2”).start();
}
公开募捐{

for(int i=0;我认为您需要阅读。请附上包含代码的
main()
的完整示例,好吗?不清楚是否可以从其他线程通知这些对象。可能会有帮助。谢谢。是的,我的意思是在实例之间共享标志,我对问题做了一个小的编辑(添加了for循环)。如果没有通知信号,线程会继续等待吗?在上述代码段中使用if和while有什么区别?B不会在A上调用notify。A将永远等待。while是循环,if不是。这不可能是完整的实现。调用
wait()
在实例上不同步将引发
非法线程状态异常
。您的问题可能与
synchronized
块的开始和结束位置有关,因此这一点非常重要。此外,您不能在像
main()这样的静态方法中引用
this
。您有什么原因不能发布一个您要求我们解决的问题的工作示例?