19

有没有办法从线程的外部停止另一个线程?就像,如果我运行一个线程来运行该线程并导致该线程停止?它会停止另一个线程吗?

有没有办法在没有循环的情况下从内部停止线程?例如,如果您正在理想地下载,您会想要使用循环,如果我使用循环,我将无法暂停它,直到它到达循环的末尾。

4

5 回答 5

28

我们不会停止或杀死线程,而是会这样做Thread.currentThread().isInterrupted().

public class Task1 implements Runnable {
    public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                       ................
                       ................
                       ................
                       ................
           }
    }
}

主要我们会这样做:

Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
于 2013-11-10T20:25:02.153 回答
25

您可以创建一个布尔字段并在运行中检查它:

public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}

要停止它,只需调用

task.kill();

这应该有效。

于 2013-11-10T20:18:36.137 回答
15

一种可能的方法是执行以下操作:

public class MyThread extends Thread {
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            //
        }
    }
}

当你想停止你的线程时,只需调用一个方法interrupt():

myThread.interrupt();

当然,这不会立即停止线程,而是在上面循环的以下迭代中。在下载的情况下,需要编写非阻塞代码。这意味着,您将仅在有限的时间内尝试从套接字读取新数据。如果没有可用的数据,它将继续。可以使用 Socket 类中的这个方法来完成:

mySocket.setSoTimeout(50);

在这种情况下,超时设置为 50 毫秒。在这段时间过去并且没有读取任何数据之后,它会抛出一个 SocketTimeoutException。这样,您可以编写迭代和非阻塞线程,这些线程可能会使用上面的构造被杀死。

不可能以任何其他方式杀死线程,您必须自己实现这种行为。过去,Thread 有一些方法(不确定是 kill() 还是 stop()),但现在已弃用。我的经验是,JVM 的某些实现目前甚至不包含该方法。

于 2013-11-10T20:33:36.877 回答
3

推荐的方法是将其构建到线程中。所以不,你不能(或者不应该)从外面杀死线程。

如果需要停止,请不经常检查线程。(而不是在有数据之前阻塞套接字。使用超时并每隔一段时间检查用户是否表示要停止)

于 2013-11-10T20:16:22.953 回答
2

JavaSun 建议使用共享变量作为要求后台线程停止的标志。然后可以由请求线程终止的不同对象设置此变量。

您可以通过这种方式杀死另一个进程,然后杀死当前进程。

于 2013-11-10T20:17:56.857 回答