我现在正在使用Thread
s(仍然......)。我发现很多线程的方法我很可能会被标记为已弃用。
是否有机会使用某些触发器暂停/恢复线程?大多数人都说要等待..但如果我不知道时间?我有一些事情可能发生在5分钟后或2小时后......
另外..另一件事。
如果我有Thread
..它有run()
方法。现在线程启动,运行它必须做的事情,然后Thread
死亡。就像永远 ?来自run()
方法的东西已经完成,因此Thread已准备好被垃圾收集器取出,或者它只是处于禁用的某个阶段但仍然存在?
现在你有一个类似的run方法:
public void run(){
while(running){
//do stuff...
}
}
如果我将运行切换到false
,则运行方法循环并停止,因为没有其他任何操作。这个线程也死吗?我可以举例说一段时间之后我想重新运行这个线程,所以我只是再次将运行设置为true
并调用run方法,或者我是否必须再次重新创建Thread
? / p>
答案 0 :(得分:2)
Thread
只能“活”一次。创建Thread
时,将Runnable
实例指定为目标(如果不是,则线程将自己定位 - 它实现Runnable
及其默认的run()
方法什么也没做)。在任何一种情况下,当线程完成其目标run()
的{{1}}方法时,线程就会死亡。
在问题中提出的示例中,在Runnable
方法返回后将running
设置为true
将无效;死后run()
无法重新启动。
如果要暂停某个线程,并在以后重用它,则有许多机制。最原始的是Thread
和wait()
。你可以等到条件发生变化,而不是等待一段特定的时间,如下所示:
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()
方法是您的代码为库提供 新线程的方法。