线程在java中notifyAll之后不打印所有内容 类锁实现可运行{ int i=0; 公共同步的无效运行(){ for(i=0;i
线程在java中notifyAll之后不打印所有内容 类锁实现可运行{ int i=0; 公共同步的无效运行(){ for(i=0;i,java,multithreading,wait,synchronized,notify,Java,Multithreading,Wait,Synchronized,Notify,i是一个实例变量。它由所有线程共享。它应该是一个局部变量 当第一个线程被唤醒时,它重新获得锁,打印其名称,增加i,并重新计算ifi
i
是一个实例变量。它由所有线程共享。它应该是一个局部变量
当第一个线程被唤醒时,它重新获得锁,打印其名称,增加i,并重新计算if
i<10
。但是由于其他线程已经将i
设置为10,循环停止。i
是一个实例变量。它由所有线程共享。它应该是一个局部变量
当第一个线程被唤醒时,它重新获得锁,打印其名称,增加i,并重新计算if
i<10
。但是由于其他线程已经将i
设置为10,循环停止。i
是一个实例变量。它由所有线程共享。它应该是一个局部变量
当第一个线程被唤醒时,它重新获得锁,打印其名称,增加i,并重新计算if
i<10
。但是由于其他线程已经将i
设置为10,循环停止。i
是一个实例变量。它由所有线程共享。它应该是一个局部变量
当第一个线程被唤醒时,它重新获得锁,打印它的名称,增加i,并重新计算if
i<10
。但是由于其他线程已经将i
设置为10,循环停止。问题是线程之间共享相同的索引i
,因此当线程t3存在且t1被唤醒时n indexi
将是10
,线程t1中的for循环将退出。问题是线程之间共享相同的索引i
,因此当线程t3存在且t1被唤醒时,indexi
将是10
,线程t1中的for循环将退出。问题是您正在共享g线程之间有相同的索引i
,因此当线程t3存在且t1被唤醒时,索引i
将是10
,线程t1中的for循环将退出。问题在于线程之间共享相同的索引i
,因此当线程t3存在且t1被唤醒时,索引i
将是 10
线程t1中的for循环将退出。在启动每个线程后尝试调用.join(),以确保每个线程在程序退出之前完成?在启动每个线程后尝试调用.join(),以确保每个线程在程序退出之前完成?尝试调用.join()在每个线程启动后,请确保每个线程在程序退出之前完成?尝试在每个线程启动后调用.join(),以确保每个线程在程序退出之前完成?虽然JB Nizet已经给出了正确答案,但您可能会想,为什么这只会影响t1
:
调用run方法(已同步)时,每个线程都在重置i
但是在返回t1执行的那一刻,它不会重置i
,因为线程已经启动了for
-循环
class Lock implements Runnable{
int i=0;
public synchronized void run(){
for(i=0;i<10;i++){
if(Thread.currentThread().getName().equals("t1") && i == 5)
{try { this.wait();} catch(InterruptedException ie){}}
System.out.print(Thread.currentThread().getName()+" ");
if(Thread.currentThread().getName().equals("t3") && i == 9)
this.notifyAll();
}
}
}
public class ThreadLock {
public static void main(String[] args){
Lock l = new Lock();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
Thread t3 = new Thread(l);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
注意:这至少是您描述的输出所发生的情况。我认为也有可能t2在t3之前执行,导致不同的输出。虽然JB Nizet已经给出了正确的答案,但您可能想知道,为什么这只会影响
t1
:
调用run方法(已同步)时,每个线程都在重置i
但是在返回t1执行的那一刻,它不会重置i
,因为线程已经启动了for
-循环
class Lock implements Runnable{
int i=0;
public synchronized void run(){
for(i=0;i<10;i++){
if(Thread.currentThread().getName().equals("t1") && i == 5)
{try { this.wait();} catch(InterruptedException ie){}}
System.out.print(Thread.currentThread().getName()+" ");
if(Thread.currentThread().getName().equals("t3") && i == 9)
this.notifyAll();
}
}
}
public class ThreadLock {
public static void main(String[] args){
Lock l = new Lock();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
Thread t3 = new Thread(l);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
注意:这至少是您描述的输出所发生的情况。我认为也有可能t2在t3之前执行,导致不同的输出。虽然JB Nizet已经给出了正确的答案,但您可能想知道,为什么这只会影响
t1
:
调用run方法(已同步)时,每个线程都在重置i
但是在返回t1执行的那一刻,它不会重置i
,因为线程已经启动了for
-循环
class Lock implements Runnable{
int i=0;
public synchronized void run(){
for(i=0;i<10;i++){
if(Thread.currentThread().getName().equals("t1") && i == 5)
{try { this.wait();} catch(InterruptedException ie){}}
System.out.print(Thread.currentThread().getName()+" ");
if(Thread.currentThread().getName().equals("t3") && i == 9)
this.notifyAll();
}
}
}
public class ThreadLock {
public static void main(String[] args){
Lock l = new Lock();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
Thread t3 = new Thread(l);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
注意:这至少是您描述的输出所发生的情况。我认为也有可能t2在t3之前执行,导致不同的输出。虽然JB Nizet已经给出了正确的答案,但您可能想知道,为什么这只会影响
t1
:
调用run方法(已同步)时,每个线程都在重置i
但是在返回t1执行的那一刻,它不会重置i
,因为线程已经启动了for
-循环
class Lock implements Runnable{
int i=0;
public synchronized void run(){
for(i=0;i<10;i++){
if(Thread.currentThread().getName().equals("t1") && i == 5)
{try { this.wait();} catch(InterruptedException ie){}}
System.out.print(Thread.currentThread().getName()+" ");
if(Thread.currentThread().getName().equals("t3") && i == 9)
this.notifyAll();
}
}
}
public class ThreadLock {
public static void main(String[] args){
Lock l = new Lock();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
Thread t3 = new Thread(l);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
注意:这至少是您描述的输出所发生的情况。我认为也有可能,t2在t3之前执行,导致不同的输出。任何活动的非守护进程线程都应该阻止jvm终止,但当main返回时,stdout可能会关闭。任何活动的非守护进程线程都应该阻止jvm终止,但当main返回时stdout可以关闭。任何活动的非守护进程线程都应该阻止jvm终止,但当main返回时stdout可以关闭。任何活动的非守护进程线程都应该阻止jvm终止,但当main返回时stdout可以关闭。谢谢。我知道了。“I”在同步方法之外,所以现在我做了“I”'for循环的局部变量。'for(int i=0;i谢谢你。我得到了。'i'在同步方法之外,所以现在我做了for循环的'i'局部变量。'for(int i=0;i谢谢你。我得到了。'i'在同步方法之外,所以现在我做了for循环的'i'局部变量。'(int i=0;i谢谢你。我知道了。“i”在同步方法之外,所以现在我创建了for循环的“i”局部变量。“for”(int i=0;i即使在你将
i
更改为