我在Runnable类A中有一个函数:
public void function1(){
synchronized(lock){
function2.decrease();
lock.notifyAll();
System.out.print(function2.getValue());
}
我在Runnable类B中有另一个函数:
public void function3(){
try{
synchronized(lock){
while(!(function2.getValue() != 0)){
lock.wait();
}
Thread.sleep(1000);
System.out.println(function2.getValue() + 10);
}
}catch(InterruptedException e){
System.err.println(e);
}
}
当我运行程序时,即使等待条件的值为true,它总是先打印在function1中,然后再打印在function3中。
在函数1中打印值之前,我需要做什么来打印函数3中的值?
最佳答案
看来您可能要多次运行function1以减小function2的值,然后在function3中进行while循环检查。因此,首先,在这种情况下,期望function1在function3之前打印是完全正常的,因为function3在其print语句之前等待1秒钟,而与此同时function1可以执行任何所需的操作。
其次,也许更优雅的解决方案是先检查function1内function2的值,然后在== 0的情况下再检查notifyAll()。这样,在function3中不需要while循环,它仅使用wait()和等待来自function1的notifyAll()调用。
我的意思是:
功能1添加
if(function2.getValue() == 0)
lock.notifyAll();
Function3移除while循环
// no while loop
lock.wait();
然后回答原始问题,以确保function3首先在function1的if语句内打印,然后在notifyAll()之后调用lock.wait()并在function3的末尾添加notifyAll()。
下面显示可编译的类。
public class StackSyncProb{
private volatile int function2;
private Object lock = new Object();
public static void main(String[] args){
StackSyncProb s = new StackSyncProb(3); // function2 starts at 3
// start function3, which waits
s.runFunction3();
// decrement using function1 until hit 0 (in this case, 3 times)
for(int i = 0; i < 3; i++){
s.runFunction1();
}
}
public StackSyncProb(int v){
function2 = v;
}
public void runFunction1(){
new Thread(new Run1()).start();
}
public void runFunction3(){
new Thread(new Run2()).start();
}
public class Run1 implements Runnable{
@Override
public void run(){
function1();
}
public void function1(){
try{
synchronized(lock){
function2--;
// Use if statement to check inside function1 instead of in function3
if(function2 == 0){
lock.notifyAll();
// After notifying, wait until function3 done
lock.wait();
}
System.out.println("function1: " + function2);
}
}catch(InterruptedException e){}
}
}
public class Run2 implements Runnable{
@Override
public void run(){
function3();
}
public void function3(){
try{
synchronized(lock){
// No while loop
lock.wait();
Thread.sleep(1000);
System.out.println("function3: " + (function2 + 10));
// Notify function1 it can complete and print
lock.notifyAll();
}
}catch(InterruptedException e){
System.err.println(e);
}
}
}
}