-2
尝试在两个线程之间以最小浪费信号发送信号。 既然已经有一段时间我尝试过了 - 请提出错误/改进建议(如果有的话)。 意向为: 1.no死锁 2.no更新被错过读取 3.尽量不提高错过的信号。在效力的顺序java线程信号发送
import java.util.Random;
class shareful{
class share{
int sharedata;
volatile boolean isbitset=false;
public int getstats(){
return sharedata;
}
public void setstats(int data){
sharedata=data;
}
public boolean getbitset(){ return isbitset;}
public void setbitset(boolean flag){ isbitset=flag;}
}
share so=new share();
void runStatistics(){
int check=0;
Thread t1=new Thread(new Runnable(){
public void run(){
Random r=new Random();
boolean isflagged=false;
while (true){
synchronized(so){
try{
while(so.getbitset()==true){
so.wait();
}
}
catch(InterruptedException e){}
so.setstats(r.nextInt(200));
if(so.getbitset()==false) isflagged=true;
so.setbitset(true);
if(isflagged) so.notify();
}
}
}
});
Thread t2=new Thread(new Runnable(){
public void run(){
boolean isflagged=false;
while(true){
synchronized(so){
try{
while(so.getbitset()==false){
so.wait();
}
}
catch(InterruptedException e){}
int curr=so.getstats();
if(so.getbitset()==true) isflagged=true;
so.setbitset(false);
if(isflagged) so.notify();
}
}
}
});
t1.start();
t2.start();
}
public static void main(String[] args){
shareful s=new shareful();
s.runStatistics();
}
}
如果你的代码确实在工作,你可能想看看http://codereview.stackexchange.com/ –
代码正在工作(没有死锁) - 并且据我所知,只有一个浪费的信号但不知道这是否是最佳选择。 – IUnknown
恕我直言,“while(true)”的存在是一个明确的指示器,表明此代码不是最优的。 – mre