塊線程我有一個情況下,使得在一個項目中存在5個線程,假設A,B,C,d和X其他操作
主題X定期觸發調用methodX()
和更新對象。 我希望A,B,C和D全部阻止,而X正在調用方法methodX()
;否則A,B,C和D將繼續而不會彼此等待。 假設A,B,C和D正在調用相同的方法,methodCommon()
。
我該如何執行這種情況?使用和可重入鎖將不適合這種情況。
塊線程我有一個情況下,使得在一個項目中存在5個線程,假設A,B,C,d和X其他操作
主題X定期觸發調用methodX()
和更新對象。 我希望A,B,C和D全部阻止,而X正在調用方法methodX()
;否則A,B,C和D將繼續而不會彼此等待。 假設A,B,C和D正在調用相同的方法,methodCommon()
。
我該如何執行這種情況?使用和可重入鎖將不適合這種情況。
你有兩個基本的選擇:
try-catch
塊捕獲一個InterruptedException
工作代碼線程(在你的情況methodCommon()
)A-d。 catch
塊會調用任何方法,包含您希望A-D在完成methodX()
時完成的工作。每種方法都有折衷。方法1可能導致A-D的數據不穩定(這取決於他們在做什麼)。方法2可能會導致A-D做比您想要的更多的工作,或者響應速度稍低於靈活性等(再次,具體取決於這些線程在做什麼)。
使用wait
和notifyAll
,嘗試這樣的事情:
public class ThreadLetter extends Thread{
private Object trigger;
public ThreadLetter(Object trigger, String name){
this.trigger=trigger;
super(name);
}
@Override
public void run(){
synchronized(trigger){
try{
trigger.wait();
}catch(InterruptedException e){
}
//invoke whatever method needs to be invoked
}
}
}
主題X:
public class ThreadX extends Thread{
private Object trigger;
public ThreadX(Object trigger){
this.trigger=trigger;
super("threadX");
}
@Override
public void run(){
synchronized(trigger){
try{
//invoke methodX
trigger.notifyAll();
}catch(InterruptedException e){
}
}
}
}
主類:
Object trigger=new Object();
ThreadLetter A=new ThreadLetter(trigger,"A");
ThreadLetter B=new ThreadLetter(trigger,"B");
ThreadLetter C=new ThreadLetter(trigger,"C");
ThreadLetter D=new ThreadLetter(trigger,"D");
ThreadX X=new ThreadX(trigger);
X.start();
A.start();
B.start();
C.start();
D.start();
如果ThreadX不運行,其他線程保持WAITING狀態,這不是我想要的 –
ReentrantReadWriteLock
解決問題的方法:
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writelock = readWriteLock.writeLock();
使用readLock
在A,B,C,d和writeLock
在X
使用['ReadWriteLock'](https://docs.oracle.com/javase/ 7 /文檔/ API/JAVA/util的/並行/鎖/ ReadWriteLock.html)。 – shmosel