Java:如何停止线程?

Java:如何停止线程?,java,multithreading,Java,Multithreading,有没有办法阻止线程外部的另一个线程? 比如,如果我运行一个线程来运行该线程并导致该线程停止?它能阻止另一条线吗 有没有一种方法可以在没有循环的情况下从内部阻止线程? 例如,如果您正在下载理想情况下,您可能希望使用循环,如果我使用循环,我将无法暂停它,直到它到达循环的末尾。建议的方法是将其构建到线程中。因此,不,您不能(或者更确切地说,不应该)从外部终止线程 如果需要停止,则不经常检查螺纹。(不要在有数据之前阻塞套接字。使用超时,并每隔一段时间检查用户是否表示要停止)JavaSun建议使用共享变量

有没有办法阻止线程外部的另一个线程? 比如,如果我运行一个线程来运行该线程并导致该线程停止?它能阻止另一条线吗

有没有一种方法可以在没有循环的情况下从内部阻止线程?
例如,如果您正在下载理想情况下,您可能希望使用循环,如果我使用循环,我将无法暂停它,直到它到达循环的末尾。

建议的方法是将其构建到线程中。因此,不,您不能(或者更确切地说,不应该)从外部终止线程


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

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


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

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

public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}
要阻止它,就打电话

task.kill();

这应该是可行的。

我们不停止或终止线程,而是执行
thread.currentThread().isInterrupted()。

大体上,我们将这样做:

Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
public class MyThread extends Thread {
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            //
        }
    }
}

一种可能的方法是这样做:

Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
public class MyThread extends Thread {
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            //
        }
    }
}
当您想停止线程时,只需调用中断()方法:

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

mySocket.setSoTimeout(50);
在本例中,超时设置为50毫秒。在该时间过去且未读取任何数据后,将抛出SocketTimeoutException。通过这种方式,您可以编写迭代的非阻塞线程,使用上面的构造可能会终止这些线程


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

您真的应该让它变得易变。那么,就没有同步问题了。但是,如何启动
run()
部分呢?像这样:<代码>任务任务=新任务(),
线程任务线程=新线程(任务)
任务线程.start()
。kill
task.kill()
?while循环中没有任何东西可以阻止工作的进行。kill()方法现在已经被弃用,interrupt()不应该更安全更干净吗@momomo自定义异常可以做到这一点。在我使用过的每个操作系统上,很容易说服套接字上的阻塞读取尽早返回。从另一个线程关闭套接字会导致读取返回错误。在大多数情况下,没有必要编写非阻塞代码-通常有一些方法可以解除阻塞:)这就是我想说的:)编写非阻塞代码的意思,例如,设置套接字超时等。因为如果您在线程内部创建了所有套接字,并且无法从外部访问,那么如果配置不正确,您将无法杀死该线程。太棒了!感谢您注意到非阻塞代码,非常有用。同样,在我使用过的任何操作系统上,都没有必要在套接字读取时使用浪费的超时。从另一个线程关闭套接字会导致read()返回错误。最好使用
thread.interrupted()
而不是
thread.currentThread().isInterrupted()
调用
t1.interrupt()
java.lang.InterruptedException:sleep interrupted
总是发生。为什么?假设部分代码不是您的(比如JDBC,一个阻止IO的驱动程序,它不检查IO是否被中断),您将如何处理它?