Thread.stop() - 已弃用

46 java multithreading

为什么Thread.stop()在Java中被弃用?在他们的网站上,我看到以下内容:

为什么Thread.stop弃用?

因为它本质上是不安全的.停止线程会导致它解锁已锁定的所有监视器.(当ThreadDeath异常传播到堆栈中时,监视器将被解锁.)如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以以不一致的状态查看这些对象.据说这些物体已被损坏.当线程对受损对象进行操作时,可能会导致任意行为.这种行为可能很微妙并且难以检测,或者可能是明显的.与其他未经检查的异常不同,它会ThreadDeath默默地杀死线程; 因此,用户没有警告他的程序可能被破坏.腐败可以在实际损害发生后的任何时间显现,甚至在未来几小时或几天.

我不明白"监视器"是什么意思.无论如何,我的问题是如果Thread.stop()不应该调用那么Java线程应该如何停止?

gob*_*ice 39

您询问:

我的问题是,如果没有办法在Java中停止线程然后如何停止线程?

答案:在Java中,没有干净,快速或可靠的方法来阻止线程.

线程终止并不是那么简单.一个正在运行的线程,通常被许多作者称为轻量级进程,它有自己的堆栈,并且是它自己命运的主人(井守护进程).它可能拥有文件和套接字.它可能会持有锁.突然终止并不总是容易的:如果线程正在写入文件并且在完成写入之前被杀死,则可能会出现不可预测的后果.或者当线头被击中时,线程所持有的监视器锁怎么办?

相反,Threads依赖于一种称为Interruption合作机制.这意味着Threads只能通知其他线程停止,而不是强制它们停止.

为了在Java中停止线程,我们依赖于一个名为Interruption的合作机制.这个概念很简单.要停止一个线程,我们所能做的只是传递一个信号,即中断它,请求线程在下一个可用的机会停止.就这样.没有人知道接收器线程可能对信号做了什么:它甚至可能不会检查信号; 或者更糟糕的是忽略它.

资料来源:http:/ 10/ 10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/


Har*_*dya 8

正确的方法是使用连接.而不是过早地停止线程的执行,join将等待线程完成执行,然后再转到下一个语句.

Thread exampleThread = new Thread(){
    public void run(){
        try {

            Thread.sleep(2000);

        } catch (InterruptedException ex) {
            //handle the exception
        }
    }
};

exampleThread.start();
exampleThread.join();
Run Code Online (Sandbox Code Playgroud)

这里,exampleThread.join()将等到exampleThread完成执行,然后再转到下一个语句.但是,确保线程完成执行的责任在于程序员.本质上没有办法停止一个线程,但如果你设计正确,你不应该停止线程.

  • 您可以使用Thread.interrupt().但无论如何,你的线程必须设计成响应中断http://stackoverflow.com/questions/5915156/how-can-i-kill-a-thread-without-using-stop/5915306#5915306 (4认同)
  • 好吧,通常你会使用一个布尔标志,它应该能够让线程脱离循环.否则你需要重新设计,首先你不应该有一个无限循环. (2认同)

Tin*_*nki 8

当您的线程正确处理中断时,应该可以使用ExecutorService接口立即终止它.根据Oracle文档ExecutorService.shutdownNow()方法,尝试在不等待终止的情况下停止所有正在执行的任务.但是,除了尽力而为之外,没有任何保证可以阻止它们.以下是一些示例代码:

class MyThread implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i < 10000000; i++)
            try {
            System.out.println(i + " ThreadID: " + Thread.currentThread().getId());
            if (Thread.interrupted()) 
                    throw new InterruptedException();
            } catch (InterruptedException e) {
                return;
        }   
    }
}

ExecutorService executor = Executors.newFixedThreadPool(3);
            executor.submit(new MyThread());
            executor.submit(new MyThread());
            executor.submit(new MyThread());
            executor.shutdownNow();
Run Code Online (Sandbox Code Playgroud)

没有终止,每个线程应该将消息打印到控制台10000000次.executor.shutdownNow()方法立即停止所有三个线程.

  • 如果仍然,您想停止特定线程,您可以使用 Future 类的 cancel() 方法来发出中断信号。 (2认同)