在java中的多线程中等待函数

时间:2013-11-08 16:51:07

标签: java multithreading

这段代码如何运作:

boolean flag=true;
while(flag){
    wait();
    flag=!flag;
}

是否会执行flag =!标志?此外,如果将flag设置为静态变量(它在实例之间共享)并启动包含以下代码的两个线程:

for(int i=0;i<5;i++){
 flag=!flag;   
 while(flag){
        System.out.println("*");
        wait();
    } 
    notify();
}

为什么程序在打印一个随机数字'*'后会停止? (即使在使用同步之后)。请解释while循环中wait()的行为。

3 个答案:

答案 0 :(得分:1)

  

.wait()说:“我已完成了我的时间片。在有人调用notify()之前,不要给我另一个时间片。“操作系统甚至不会尝试安排你的任务,除非有人调用notify()(或其他一些其他唤醒场景)。

     

是否会执行flag =!标志?

是的,线程被唤醒后。

  

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

标志为静态意味着它在实例之间共享,对吗?

假设旗帜开始为真。

  • 你产生一个线程A。
  • 您生成另一个线程B.线程在随机延迟后开始运行。
  • A将标志从false设置为true。 A开始运行循环。等到它再次被唤醒。
  • 某些时候B开始跑步。当它这样做时,它将flag设置为false。 B直接通知();它唯一通知的是它自己。
  • A继续等待notify(),B已经终止。
  • 如果在某个时候通知A,它将继续循环,看到该标志不再为真并继续并终止。

答案 1 :(得分:1)

  

是否会执行flag =!标志?

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

  

为什么程序在打印随机数字'*'后会停止?

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

请用Short, Self-Contained, Correct Example.

替换假代码

答案 2 :(得分:0)

这是一个完整的实现:

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

用if(flag)语句替换while(flag)语句完全正常。当使用while时,它会在给出完整输出的一部分后停止。