-2
최소한의 낭비되는 신호로 2 개의 스레드간에 신호를 보내려는 시도. 내가 시도한 시간이 얼마 남지 않았으므로 오류/개선 사항을 제안하십시오. 의도는 다음과 같습니다. 1. 교착 상태가 없음 2. 읽을 때 업데이트가 누락되었습니다. 3. 가능한 한 누락 된 신호를 발생시키지 않습니다. 효과의 순서로자바 스레드 시그널링
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
IMHO 'while (true)'의 존재는이 코드가 최적이 아니라는 확실한 지표입니다. – mre