我试图阻止当前线程,更改run()方法,然后重新启动该线程。我环顾四周,大多数方法都被弃用了。但是,interrupt()不是。我不确定你是否需要这样做。
interrupt();
start();
这对我需要它做什么有用吗?它说你不应该多次启动一个线程,我不知道它是否意味着
start();
start();
而不是我想做的事。
感谢任何帮助。
由于
答案 0 :(得分:4)
不,你不能这样做。 java online docs:
不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
答案 1 :(得分:3)
不要重启线程。您总是可以重写您的业务逻辑以其他方式执行此操作。考虑使用SingleThreadExecutor
答案 2 :(得分:2)
在这种情况下,您应该创建一个Runnable对象并将其传递给一个线程。然后你要创建不同的线程,但重新使用'work'对象。
答案 3 :(得分:1)
调用interrupt()
将设置线程的中断状态可能会中断阻塞方法。这是合作取消机制的一部分。你不能用它来强迫线程停止运行。
由于某种原因,不推荐使用停止线程:它本身就很危险,因为它可能会使处于不一致状态的状态变量保持不变。
你不应该这样做。将您的代码从run()
方法转换为Runnable
,然后将其提交给Executor
执行。这将返回Future
,您可以使用它来检索其结果以及取消它。
如果要将相同的线程重用于其他计算,请使用线程池,例如Executors
中的Executors.newFixedThreadPool()
和其他工厂方法。
答案 4 :(得分:1)
一旦你开始一个线程,你只能打断它。一旦你完成了,你就无法重新开始。有关详细信息,请参阅here。
我不太确定你想做什么,但听起来你想要按顺序运行不同的Runnables。在这种情况下,请使用SingleThreadExecutor并提交您的Runnables。它将按顺序运行这些,因此中断第一个(成功)将调用第二个。
我仍然不确定这是一个好主意(它听起来不对),也许发布更详细的问题描述会让人们更好地了解你真正想做的事情。
答案 5 :(得分:1)
您应该更多地了解线程的基础知识。一个线程只能运行一次。如果你想让线程运行不同的代码,你需要创建一个新的线程。
interrupt()方法不会立即停止某个线程(没有支持)这样做,它只会通过抛出InterruptedException()而在某些点停止。
答案 6 :(得分:1)
我认为你是以错误的方式接近你的问题。你不能'改变Thread的run()方法'。但是你可能想要的是停止前一个线程并使用不同的run()方法创建一个新线程。
但要注意的一点是,Threads被设计为尽可能自主,并且不喜欢来自其他线程的干扰,这就是不推荐使用suspend()和resume()的原因。它们会根据具体情况制造各种不良行为,并且容易出现僵局。
然而,你有2个完全安全的选择:
你需要在run()方法中决定可以安全地“停止”线程,并在那时放一个wait()或sleep()。你的线程只会在那一刻停止。
然后,另一个线程可以执行notify()或sleep(),以便通知或中断正在运行的线程。在interrupt()的情况下,您将获得一个InterruptedException,您可以使用它来终止您在该线程中所做的事情。
在中断旧线程之后,您可以使用具有不同run()方法的新Runnable实现启动一个新线程。