我有一个案例,项目中存在5个线程,比方说A,B,C,D和X.
定期触发线程X以调用methodX()
并更新对象。
我想要A,B,C和D到所有块,而X正在调用方法methodX()
;
否则A,B,C和D将继续而不等待彼此。
假设A,B,C和D正在调用相同的方法methodCommon()
。
我该如何实施这样的案例?使用synchronized
和重入锁将不适合这种情况。
答案 0 :(得分:1)
您有两个基本选项:
methodCommon()
的{{1}}块将线程A-D(在您的情况下为try-catch
)中包裹工作代码。 InterruptedException
块调用任何包含您希望A-D在X完成catch
时要完成的工作的方法。每种方法都有权衡。方法1可能导致A-D的数据不稳定(这取决于他们具体做什么)。方法2可能会导致A-D比您想要的工作多一点,或者响应稍微小于snappy等等(再次,具体取决于这些线程正在做什么)。
答案 1 :(得分:1)
ReentrantReadWriteLock
解决了您的问题:
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writelock = readWriteLock.writeLock();
在A,B,C,D中使用readLock
,在X
writeLock
答案 2 :(得分:0)
使用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();