2011-12-28 188 views
1

我试图停止当前线程,更改run()方法,然后重新启动该线程。我环顾四周,大多数方法都被弃用了。但是,interrupt()不是。我不确定这是你需要做的。停止并重新启动线程

interrupt(); 
start(); 

这样可以满足我需要的吗?它说,你不应该启动一个线程不止一次,我不知道这是否意味着

start(); 
start(); 

而不是我想做的事。

任何帮助表示赞赏。

感谢

+0

不知道你的意思是改变运行方法。你可以通过sleep()获得一个线程暂停。要停止线程,最好通过完成run()方法来终止线程。然后,如果你想使用线程,你会创建一个新的线程。否则,如下使用执行者。 – Davos555 2011-12-28 12:23:52

回答

3

请勿重新启动线程。你总是可以重写你的buisness逻辑来做其他的一些事情。考虑使用SingleThreadExecutor

1

调用interrupt()将设置线程的中断状态可能中断阻塞的方法。这是合作取消机制的一部分。你不能用它强制线程停止运行。

停止线程已被弃用的原因是:它本质上是危险的,因为它可能会使状态变量处于不一致的状态。

你不应该这样做。将您的代码从run()方法转换为Runnable,并将其提交至Executor。这将返回Future您可以使用它来检索其结果以及取消它。

如果您想在其他计算中重复使用相同的线程,请使用线程池,例如参见Executors.newFixedThreadPool()Executors中的其他工厂方法。

1

一旦你开始一个线程,你只能中断它。一旦你这样做了,你不能再启动它。有关更多详细信息,请参见here

我不太清楚你想做什么,但它听起来像你有不同的Runnables,你想按顺序运行。在这种情况下,请使用SingleThreadExecutor并提交您的Runnables。它将以的顺序运行这些,因此中断第一个(成功)将调用第二个。

我仍然不确定这是一个好主意(它听起来不对),也许发布更详细的问题描述会让人们更清楚自己真正想要做什么。

4

不,你不能那样做。 Fron the java online docs

多次启动线程永远不合法。特别是,线程一旦完成执行就不会重新启动。

2

在这种情况下,您应该创建一个Runnable对象并将其传递给线程。然后你创建不同的线程,但重新使用“工作”对象。

1

您应该更深入地了解线程的基础知识。一个线程只能运行一次。如果你想让线程运行不同的代码,你需要创建一个新的线程。

interrupt()方法不会立即停止线程(没有支持)的方式来做到这一点,它只会通过抛出InterruptedException()来停止某些点。

1

我认为你是以错误的方式接近你的问题。你不能'更改线程的run()方法'。然而你可能想要的是停止前一个线程并用不同的run()方法创建一个新线程。

但是,要记住的一件事是线程被设计为尽可能自治,他们不喜欢来自其他线程的干扰,这就是为什么suspend()和resume()不推荐使用。他们根据情况创造各种不良行为,也容易陷入僵局。

你有2个绝对安全的替代品。然而:特定的共享对象

  1. 使用wait()和notify()。
  2. 使用睡眠()和中断()

您需要在运行中决定()方法,它是安全的“一站式”的线程,在这一点上放一个wait()或睡眠( )。你的线程只会停在那一点。

然后其他线程可以执行notify()或sleep(),以便运行线程得到通知或中断。在interrupt()的情况下,你会得到一个InterruptedException,你可以用它来终止你在那个线程中做的事情。

中断旧线程后,您可以启动一个新线程,并使用具有不同run()方法的新Runnable实现进行初始化。