阻止线程进行其他操作

时间:2017-01-11 17:50:48

标签: java synchronization

我有一个案例,项目中存在5个线程,比方说A,B,C,D和X.

定期触发线程X以调用methodX()并更新对象。 我想要A,B,C和D到所有块,而X正在调用方法methodX(); 否则A,B,C和D将继续而不等待彼此。 假设A,B,C和D正在调用相同的方法methodCommon()

我该如何实施这样的案例?使用synchronized和重入锁将不适合这种情况。

3 个答案:

答案 0 :(得分:1)

您有两个基本选项:

  1. 使用捕获methodCommon()的{​​{1}}块将线程A-D(在您的情况下为try-catch)中包裹工作代码。 InterruptedException块调用任何包含您希望A-D在X完成catch时要完成的工作的方法。
  2. 声明X将用于标记AD的 volatile synchronized 变量,并且AD需要定期检查以确定它们是否应该执行特殊操作。
  3. 每种方法都有权衡。方法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)

使用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();