java中的线程之间的通信:如果另一个线程已完成,则停止线程
如何让一个线程只在其他线程运行时才运行,意思是说,如果我从一个线程中运行返回,那么我希望另一个线程停止运行也 我的代码看起来是这样的: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
,而不是如何从运行 感谢
编辑的问题澄清
我看到两个直接的选择停止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,并终止或重置中断标志。
只有当run()
方法返回时,Thread
才会停止。 Thread#interrupt()
仅表示请求中断。您仍然必须相应地使用run()
方法编写代码,以便定期检查Thread#isInterrupted()
并进行相应处理。例如。请在Thread
正在执行的任务的每个单元上检查它,或者在连接了某种progresslistener的情况下检查每个特定进度。
Thread2不会中断,它只是返回从它的run方法中,我尝试在clientMesasgehandler中传递一个参数,并在servertMesasgehandler中的循环条件中检查是否thread1.isAlive(),但thread1仍然返回,即使thread2应该仍在运行,即它在一次迭代后返回在运行循环中。顺便说一句,clientMesasgehandler在其run方法中也包含一个无限循环。 – Noona 2010-05-12 12:14:03
我想你错过了这一点。只要你想停止线程,Thread1 **必须从'run()'方法返回。你需要在Thread1上调用'Thread#interrupt()'。您需要重写Thread1的run()方法,以便定期检查Thread#isInterrupted()是否返回true,如果是,则从run()方法返回。 – BalusC 2010-05-12 12:24:46
但thread2不会中断,它只是从它的run方法返回并且不再活着,在这种情况下,我也想从thread1返回。 – Noona 2010-05-12 19:35:28
这个小例子,应该证明的基本思想:
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();
}
}
它不会立即停止... [编辑]是的罚款,编辑在事后。 – BalusC 2010-05-12 03:51:43
@BalusC是的,我知道,我正在尝试一些汤姆霍林博客的内容。 – 2010-05-12 03:56:56
我的意思是,检测thread2停止运行时,为了停止thread1运行,而不是如何停止运行thread1 – Noona 2010-05-12 04:14:04