线程操纵和线程破坏的最佳实践?

时间:2015-08-04 16:47:43

标签: java multithreading

我现在正在使用Thread s(仍然......)。我发现很多线程的方法我很可能会被标记为已弃用。

是否有机会使用某些触发器暂停/恢复线程?大多数人都说要等待..但如果我不知道时间?我有一些事情可能发生在5分钟后或2小时后......

另外..另一件事。

如果我有Thread ..它有run()方法。现在线程启动,运行它必须做的事情,然后Thread死亡。就像永远 ?来自run()方法的东西已经完成,因此Thread已准备好被垃圾收集器取出,或者它只是处于禁用的某个阶段但仍然存在?

现在你有一个类似的run方法:

public void run(){
   while(running){
      //do stuff...
   }
}

如果我将运行切换到false,则运行方法循环并停止,因为没有其他任何操作。这个线程也死吗?我可以举例说一段时间之后我想重新运行这个线程,所以我只是再次将运行设置为true并调用run方法,或者我是否必须再次重新创建Thread? / p>

2 个答案:

答案 0 :(得分:2)

Thread只能“活”一次。创建Thread时,将Runnable实例指定为目标(如果不是,则线程将自己定位 - 它实现Runnable及其默认的run()方法什么也没做)。在任何一种情况下,当线程完成其目标run()的{​​{1}}方法时,线程就会死亡。

在问题中提出的示例中,在Runnable方法返回后将running设置为true将无效;死后run()无法重新启动。

如果要暂停某个线程,并在以后重用它,则有许多机制。最原始的是Threadwait()。你可以等到条件发生变化,而不是等待一段特定的时间,如下所示:

notify()

这是很多代码,而且很脆弱。我已经写Java 20年了,我不确定我做对了。这就是你应该使用abstract class Pausable implements Runnable { private final Object lock = new Object(); private boolean pause = false; abstract void doSomething(); @Override public void run() { while (cantering()) doSomething(); } private boolean cantering() { synchronized (lock) { while (pause) { try { lock.wait(); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); return false; } } } return true; } final void whoa() { synchronized(lock) { pause = true; } } final void giddyup() { synchronized(lock) { pause = false; lock.notify(); } } } 中正确的工具的原因。例如,如果要唤醒线程来处理消息,请使用java.util.concurrency,让消费线程等待消息到达队列。如果您有要异步执行的任务以响应某些事件,请创建BlockingQueue并提交任务。即使您确实想要使用ExecutorService之类的内容,wait()/notify()包的concurrency类也会为您提供比内部锁提供更多的锁定控制权。

答案 1 :(得分:1)

  

我可以[...]并调用run方法吗?

如果你有一个Thread t = ...;,并且你打电话给t.run(),那么你可能犯了一个错误。

Thread不是主题线程是通过代码执行的路径。 Thread是一个对象,其方法可用于创建新的线程并管理其生命周期。

您可以通过调用t.start()来创建新的主题

请记住这句口头禅:

start()方法是为您的代码在您想要启动新线程时调用的方法。

run()方法是您的代码为库提供 新线程的方法。