有没有办法从线程的OUTSIDE中停止另一个线程? 就像,如果我运行一个线程来运行该线程并导致该线程停止?它会阻止其他线程吗?
有没有办法在没有循环的情况下从内部停止线程? 例如,如果您正在理想地下载,则需要使用循环,如果我使用循环,我将无法暂停它直到它到达循环结束。
答案 0 :(得分:26)
您可以创建一个布尔字段并在run:
中进行检查public class Task implements Runnable {
private volatile boolean isRunning = true;
public void run() {
while (isRunning) {
//do work
}
}
public void kill() {
isRunning = false;
}
}
要停止它,只需致电
task.kill();
这应该有用。
答案 1 :(得分:26)
我们不会停止或杀死一个帖子而是Thread.currentThread().isInterrupted().
public class Task1 implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
................
................
................
................
}
}
}
在main中我们会这样做:
Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
答案 2 :(得分:14)
一种可能的方法是做这样的事情:
public class MyThread extends Thread {
@Override
public void run() {
while (!this.isInterrupted()) {
//
}
}
}
当你想要停止你的线程时,只需调用方法interrupt():
myThread.interrupt();
当然,这不会立即停止线程,而是在上面循环的后续迭代中。在下载的情况下,您需要编写非阻止代码。这意味着,您将尝试仅在有限的时间内从套接字读取新数据。如果没有可用数据,它将继续。可以使用Socket:
类中的此方法来完成mySocket.setSoTimeout(50);
在这种情况下,超时设置为50 ms。在这段时间过去之后没有读取任何数据,它会抛出一个SocketTimeoutException。这样,您可以编写迭代和非阻塞线程,可以使用上面的构造将其杀死。
不可能以任何其他方式杀死线程,而你自己也要实现这样的行为。在过去,Thread有一些方法(不确定是否kill()或stop()),但它现在已被弃用。我的经验是,JVM的某些实现目前甚至不包含该方法。
答案 3 :(得分:3)
推荐的方法是将其构建到线程中。所以不,你不能(或者不应该)从外面杀死线程。
如果需要停止,请不经常检查线程。 (而不是在有数据之前阻塞套接字。使用超时并且每隔一段时间检查用户是否指示要停止)
答案 4 :(得分:2)
JavaSun推荐是使用共享变量作为标志,要求后台线程停止。然后,该变量可以由请求线程终止的不同对象设置。
你可以通过这种方式杀死其他进程,然后杀死当前进程。