我的问题是关注
父线程创建5个子线程并且所有子线程开始查找结果,并且一个子线程获得它必须通知父线程它得到结果并终止所有其他子线程的结果
答案 0 :(得分:2)
这不是一个理智的方式。只需对子线程进行编码即可停止执行不再需要完成的工作。每当你发现自己问“如何从外部推动我的代码来实现我想做的事情?”时,请停下来并纠正自己。正确的问题是,“我怎样才能编写代码来做我真正希望它做的事情,这样我就不必从外面推动它了?”
答案 1 :(得分:2)
设置子项以更新父项中的字段(如果它不为空)。让孩子偶尔检查字段是否为空。如果不是,他们应该停止。
这有用吗?
答案 2 :(得分:2)
我觉得终止子线程执行的其他子线程是完全可以接受的。特别是如果子线程使用阻塞方法。您只需要孩子可以访问的父stop
方法。
类似的东西:
public interface Stopable {
public void stop ();
}
public class Child
extends Thread {
final Stopable parent;
boolean foundAnswer = false;
Child ( Stopable parent ) {
this.parent = parent;
}
public void run () {
try {
while ( !isInterrupted() ) {
// Do some work.
work();
if ( foundAnswer ) {
// Stop everyone.
parent.stop();
}
}
} catch ( InterruptedException ie ) {
// Just exit when interrupted.
}
}
private void work () throws InterruptedException {
while ( !foundAnswer ) {
// Do some work.
// Should we stop now?
checkForInterrupt ();
}
}
private void checkForInterrupt () throws InterruptedException {
if ( isInterrupted() ) {
throw new InterruptedException();
}
}
}
public class Mainthread
implements Stopable {
ArrayList<Child> children = new ArrayList<Child> ();
public void go () {
// Spawn a number of child threads.
for ( int i = 0; i < 5; i++ ) {
Child newChild = new Child( this );
children.add( newChild );
newChild.start();
}
}
public void stop () {
// Interrupt/kill all child threads.
for ( Child c : children ) {
c.interrupt();
}
}
}