2017-01-11 73 views
2

塊線程我有一個情況下,使得在一個項目中存在5個線程,假設A,B,C,d和X其他操作

主題X定期觸發調用methodX()和更新對象。 我希望A,B,C和D全部阻止,而X正在調用方法methodX();否則A,B,C和D將繼續而不會彼此等待。 假設A,B,C和D正在調用相同的方法,methodCommon()

我該如何執行這種情況?使用​​和可重入鎖將不適合這種情況。

+0

使用['ReadWriteLock'](https://docs.oracle.com/javase/ 7 /文檔/ API/JAVA/util的/並行/鎖/ ReadWriteLock.html)。 – shmosel

回答

1

你有兩個基本的選擇:

  1. 裹有try-catch塊捕獲一個InterruptedException工作代碼線程(在你的情況methodCommon())A-d。 catch塊會調用任何方法,包含您希望A-D在完成methodX()時完成的工作。
  2. 聲明一個易失性,同步 X將用於標記A-D的變量,並且A-D需要定期檢查以確定它們是否應該執行特殊操作。

每種方法都有折衷。方法1可能導致A-D的數據不穩定(這取決於他們在做什麼)。方法2可能會導致A-D做比您想要的更多的工作,或者響應速度稍低於靈活性等(再次,具體取決於這些線程在做什麼)。

+0

我很好奇你對這個問題的理解。聽起來像一個簡單的讀/寫場景。我看不出你的建議是如何相關的。 – shmosel

+0

我可以問你同樣的問題。你如何從一個沒有提及讀或寫的問題中獲得「讀/寫場景」,除了線程X更新對象所暗含的內容? –

+1

我的意思是說,X是A-D專有的,它不是彼此唯一的。這是一種經典的讀/寫鎖定方案,無論實際操作如何。 – shmosel

0

使用waitnotifyAll,嘗試這樣的事情:

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(); 
+0

如果ThreadX不運行,其他線程保持WAITING狀態,這不是我想要的 –

1

ReentrantReadWriteLock解決問題的方法:

ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); 
Lock readLock = readWriteLock.readLock(); 
Lock writelock = readWriteLock.writeLock(); 

使用readLock在A,B,C,d和writeLock在X

相關問題