java中线程之间的通信:如果另一个线程已完成,则停止该线程
我怎样才能让一个线程在另一个线程也在运行的情况下运行,也就是说,如果我从一个线程运行返回,那么我希望另一个线程也停止运行, 我的代码如下所示:java中线程之间的通信:如果另一个线程已完成,则停止该线程,java,multithreading,Java,Multithreading,我怎样才能让一个线程在另一个线程也在运行的情况下运行,也就是说,如果我从一个线程运行返回,那么我希望另一个线程也停止运行, 我的代码如下所示: ClientMessageHandler clientMessagehandler = new ClientMessageHandler(); ServerMessageHandler serverMessagehandler = new ServerMessageHandler(); Thread thread1 = new Thread(server
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()
或a等待thread2终止。当控件从联接(或)返回时
确保在thread1的run方法中,您有一些逻辑位置可以检查中断状态()并决定终止。此外,您必须注意正确处理并终止或重置中断标志。编辑以澄清问题 我认为有两个直接的选择: 备选案文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()
或a等待thread2终止。当控件从联接(或)返回时
确保在thread1的run方法中,您有一些逻辑位置可以检查中断状态()并决定终止。此外,您必须注意正确处理并终止或重置中断标志。只有当
run()
方法返回时,线程才会停止。请求中断的唯一信号。您仍然必须相应地在run()
方法中编写代码,以便它定期检查并相应地处理。例如,在线程执行的每个任务单元上检查它,或者在连接了sort of progresslistener的每个特定进程上检查它。只有当run()
方法返回时,线程才会停止。请求中断的唯一信号。您仍然必须相应地在run()
方法中编写代码,以便它定期检查并相应地处理。例如,检查线程正在执行的每一个任务单元,或连接排序progresslistener时的每一个特定进度。这个最小的示例应该演示基本思想:
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();
}
}
import java.io.*;
导入java.util.concurrent.LinkedBlockingQueue;
公开课考试{
静态LinkedBlockingQueue msgBuf=新LinkedBlockingQueue();
静态可变布尔修剪=true;
静态螺纹螺纹1、螺纹2;
公共静态void main(字符串[]args)引发IOException{
ClientMessageHandler ClientMessageHandler=新的ClientMessageHandler();
ServerMessageHandler ServerMessageHandler=新的ServerMessageHandler();
thread1=新线程(serverMessagehandler);
thread2=新线程(clientMessagehandler);
thread2.start();
thread1.start();
}
}
类ClientMessageHandler实现Runnable{
公开募捐{
while(测试、继续修剪){
试一试{
字符串msg=Test.msgBuf.take();
System.out.println(“吃”+味精);
}捕获(中断异常ie){
}
}
}
}
类ServerMessageHandler实现Runnable{
公开募捐{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
串入;
试一试{
而(!(in=br.readLine()).equals(“退出”)){
系统输出打印项次(“进料”+in);
Test.msgBuf.offer(in);
}
}捕获(IOE异常){
}
Test.keepRunning=false;
Test.thread2.interrupt();
}
}
这个最简单的例子应该说明以下基本思想:
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();
}
}
import java.io.*;
导入java.util.concurrent.LinkedBlockingQueue;
公开课考试{
静态LinkedBlockingQueue msgBuf=新LinkedBlockingQueue();
静态可变布尔修剪=true;
静态螺纹螺纹1、螺纹2;
公共静态void main(字符串[]args)引发IOException{
ClientMessageHandler ClientMessageHandler=新的ClientMessageHandler();
ServerMessageHandler ServerMessageHandler=新的ServerMessageHandler();
thread1=新线程(serverMessagehandler);
thread2=新线程(clientMessagehandler);
thread2.start();
thread1.start();
}
}
类ClientMessageHandler实现Runnable{
公开募捐{
while(测试、继续修剪){
试一试{
字符串msg=Test.msgBuf.take();
System.out.println(“吃”+味精);
}捕获(中断异常ie){
}
}
}
}
类ServerMessageHandler实现Runnable{
公开募捐{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
串入;
试一试{
而(!(in=br.readLine()).equals(“退出”)){
系统输出打印项次(“进料”+in);
Test.msgBuf.offer(in);
}
}捕获(IOE异常){
}
Test.keepRunning=false;
Test.thread2.interrupt();
}
}
它不会立即停止。。。是的,很好,以后再编辑。@BalusC是的,我知道,我正在尝试Tom Hawtin在博客上写的东西。我的意思是,检测thread2何时停止运行以阻止thread1运行,而不是如何阻止thread1运行running@Noona,我做了一些繁重的编辑以弥补您的澄清。aIt不会立即停止。。。