这段代码如何运作:
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()的行为。
答案 0 :(得分:1)
.wait()说:“我已完成了我的时间片。在有人调用notify()之前,不要给我另一个时间片。“操作系统甚至不会尝试安排你的任务,除非有人调用notify()(或其他一些其他唤醒场景)。
是否会执行flag =!标志?
是的,线程被唤醒后。
此外,如果将flag设置为静态变量并启动包含以下代码的两个线程:
标志为静态意味着它在实例之间共享,对吗?
假设旗帜开始为真。
答案 1 :(得分:1)
是否会执行flag =!标志?
是。如果另一个线程在此对象上调用notify()
或notifyAll()
,wait()
调用将返回,flag
将被清除,从而导致循环退出。
为什么程序在打印随机数字'*'后会停止?
如果代码真的如上所述,则只应打印两个*
,因为线程在notify()
调用时无法调用wait()
,并且没有其他线程是显示调用notify()
。
答案 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时,它会在给出完整输出的一部分后停止。