2017-01-11 52 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

相关问题