2010-05-12 34 views
0

如何让一个线程只在其他线程运行时才运行,意思是说,如果我从一个线程中运行返回,那么我希望另一个线程停止运行也 我的代码看起来是这样的:java中的线程之间的通信:如果另一个线程已完成,则停止线程

ClientMessageHandler clientMessagehandler = new ClientMessageHandler(); 
ServerMessageHandler serverMessagehandler = new ServerMessageHandler(); 
Thread thread1 = new Thread(serverMessagehandler); 
Thread thread2 = new Thread(clientMessagehandler); 
thread2.start(); 
thread1.start(); 

我想引起thread1停止时thread2停止运行运行。

编辑:检测thread2停止,以便运行停止运行thread1,而不是如何从运行 感谢

回答

2

编辑的问题澄清

我看到两个直接的选择停止thread1

选项1.让ClientMessageHandler实现在终止时终止ServerMessageHandler。这意味着客户端需要对服务器线程的引用。

public class ClientMessageHandler implements Runnable { 
    Thread serverThread; 
    public ClientMessageHandler(Thread srvThread) { 
     this.serverThread = srvThread; 
    } 
    public void run() { 
     try { 
      while (true) { ... } 
     } finally { 
      serverThread.interrupt(); 
     } 
    } 
} 

选项2.使用thread2.join()CountDownLatch等待线程2终止。控制从联接返回时(或CountDownLatch#await())。

ClientMessageHandler clientMessagehandler = new ClientMessageHandler(); 
ServerMessageHandler serverMessagehandler = new ServerMessageHandler(); 
Thread thread1 = new Thread(serverMessagehandler); 
Thread thread2 = new Thread(clientMessagehandler); 
thread2.start(); 
thread1.start(); 

thread2.join(); //blocks until the client terminates 
thread1.interrupt(); 

确保内部线程1的run方法,你有一些合乎逻辑的地方,你可以检查中断状态(Thread#isInterrupted()),并决定终止。另外,您必须小心处理InterruptedException,并终止或重置中断标志。

+0

它不会立即停止... [编辑]是的罚款,编辑在事后。 – BalusC 2010-05-12 03:51:43

+0

@BalusC是的,我知道,我正在尝试一些汤姆霍林博客的内容。 – 2010-05-12 03:56:56

+0

我的意思是,检测thread2停止运行时,为了停止thread1运行,而不是如何停止运行thread1 – Noona 2010-05-12 04:14:04

1

只有当run()方法返回时,Thread才会停止。 Thread#interrupt()仅表示请求中断。您仍然必须相应地使用run()方法编写代码,以便定期检查Thread#isInterrupted()并进行相应处理。例如。请在Thread正在执行的任务的每个单元上检查它,或者在连接了某种progresslistener的情况下检查每个特定进度。

+0

Thread2不会中断,它只是返回从它的run方法中,我尝试在clientMesasgehandler中传递一个参数,并在servertMesasgehandler中的循环条件中检查是否thread1.isAlive(),但thread1仍然返回,即使thread2应该仍在运行,即它在一次迭代后返回在运行循环中。顺便说一句,clientMesasgehandler在其run方法中也包含一个无限循环。 – Noona 2010-05-12 12:14:03

+0

我想你错过了这一点。只要你想停止线程,Thread1 **必须从'run()'方法返回。你需要在Thread1上调用'Thread#interrupt()'。您需要重写Thread1的run()方法,以便定期检查Thread#isInterrupted()是否返回true,如果是,则从run()方法返回。 – BalusC 2010-05-12 12:24:46

+0

但thread2不会中断,它只是从它的run方法返回并且不再活着,在这种情况下,我也想从thread1返回。 – Noona 2010-05-12 19:35:28

3

这个小例子,应该证明的基本思想:

import java.io.*; 
import java.util.concurrent.LinkedBlockingQueue; 

public class Test { 

    static LinkedBlockingQueue<String> msgBuf = new LinkedBlockingQueue<String>(); 
    static volatile boolean keepRunning = true; 
    static Thread thread1, thread2; 

    public static void main(String[] args) throws IOException { 
     ClientMessageHandler clientMessagehandler = new ClientMessageHandler(); 
     ServerMessageHandler serverMessagehandler = new ServerMessageHandler(); 
     thread1 = new Thread(serverMessagehandler); 
     thread2 = new Thread(clientMessagehandler); 
     thread2.start(); 
     thread1.start(); 
    } 

} 

class ClientMessageHandler implements Runnable { 
    public void run() { 
     while (Test.keepRunning) { 
      try { 
       String msg = Test.msgBuf.take(); 
       System.out.println("Eating " + msg); 
      } catch (InterruptedException ie) { 
      } 
     } 
    } 
} 

class ServerMessageHandler implements Runnable { 
    public void run() { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String in; 
     try { 
      while (!(in = br.readLine()).equals("quit")) { 
       System.out.println("Feeding " + in); 
       Test.msgBuf.offer(in); 
      } 
     } catch (IOException e) { 
     } 
     Test.keepRunning = false; 
     Test.thread2.interrupt(); 
    } 
}