块线程我有一个情况下,使得在一个项目中存在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