Java:如何阻止线程?

J C*_*ode 18 java multithreading

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

有没有办法在没有循环的情况下从内部停止线程?例如,如果您正在理想地下载,则需要使用循环,如果我使用循环,则无法暂停它直到它到达循环结束.

Fer*_*ndo 26

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

public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}
Run Code Online (Sandbox Code Playgroud)

要阻止它只是打电话

task.kill();
Run Code Online (Sandbox Code Playgroud)

这应该工作.

  • 你真的应该让它变得不稳定.那么没有同步问题. (9认同)

Try*_*ing 26

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

public class Task1 implements Runnable {
    public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                       ................
                       ................
                       ................
                       ................
           }
    }
}
Run Code Online (Sandbox Code Playgroud)

在主要我们将这样做:

Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
Run Code Online (Sandbox Code Playgroud)


tzi*_*ima 14

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

public class MyThread extends Thread {
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            //
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

myThread.interrupt();
Run Code Online (Sandbox Code Playgroud)

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

mySocket.setSoTimeout(50);
Run Code Online (Sandbox Code Playgroud)

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

以任何其他方式杀死线程是不可能的,你自己要实现这样的行为.在过去,Thread有一些方法(不确定是否kill()或stop()),但它现在已被弃用.我的经验是,JVM的某些实现目前甚至不包含该方法.


ode*_*dsh 3

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

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