【发布时间】:2014-06-07 04:26:53
【问题描述】:
我有一个工作线程数固定的线程池(比如 4 个)。我不断地向执行者获取新的可运行文件。所有这些runnables都有一个长时间的睡眠调用,等待另一个线程被它中断:
Runnable runnable = new Runnable() {
@Override
public void run() {
//do preparation
doPreWork();
//wait for some other runnable to interrupt me
try {
Thread.sleep(40000);
}
catch(InterruptedException e) {
}
//finish work
doAfterWork();
}
}
所以问题是:当我将前 4 个可运行对象获取到我的执行程序时,所有工作线程都处于睡眠状态,而其他传入的可运行对象(其中很多,因为它们是不断传入的)排队并且必须等待可用线程。有什么办法,我可以使用睡眠线程来执行新传入的可运行对象,保持其他人的睡眠?
【问题讨论】:
-
我不明白这个问题。如果您的任务调用睡眠,那么正在运行它的线程将无法执行任何其他操作。如果提交了另一个任务,它将启动另一个线程或等待,具体取决于正在使用的
ExecutorService的类型。 -
@Gray,问题是我不想为每个可运行的线程创建一个新线程,因为会有数千个线程。我该如何设计它,让排队的 runnbales 不用等待?
-
Thread.sleep() 在以下情况下很有用; (a) 你想强制一个特定的线程交错用于演示目的(例如,揭示一个并发错误),(b) 你想重新发明轮子,并编写你自己的调度程序,或者 (c) 作为一个真正的在单线程程序中减慢循环的 hacky 方法。在任何严肃的多线程软件中显式调用 Thread.sleep() 通常是一个糟糕的选择。
标签: java multithreading threadpool executorservice