-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