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
。您有什么原因不能发布一个您要求我们解决的问题的工作示例?