0
我正在研究一个基于Java的程序,该程序从文件读取并将每行发送到其自己的处理Runnable中以执行一些单线程计算。我正在使用一个固定的线程池,每个可用内核有一个任务来并行化这个。该文件非常庞大,在提交作业时无法将每个文件加载到内存中。是否有可能让主线程(即提交这些任务)暂停直到线程池中的线程变为可用?修复线程池:暂停直到线程可用?
我正在研究一个基于Java的程序,该程序从文件读取并将每行发送到其自己的处理Runnable中以执行一些单线程计算。我正在使用一个固定的线程池,每个可用内核有一个任务来并行化这个。该文件非常庞大,在提交作业时无法将每个文件加载到内存中。是否有可能让主线程(即提交这些任务)暂停直到线程池中的线程变为可用?修复线程池:暂停直到线程可用?
创建一个简单的线程池,其可用工作线程与池大小相同。提交前检查是否有可用线程,然后提交else等待锁定。
你也可以使用Semaphore,它会阻塞,直到acquire()会获得一些价值。 信号灯exanple:简单的线程池的
Semaphore semaphore = new Semaphore(pool_size);
//critical section
semaphore.acquire();
...
semaphore.release();
例子:
private List<WorkerThread> workers;
private LinkedList<WorkerThread> availWorkers = new LinkedList<WorkerThread>();
private LinkedList<WorkerThread> busyWorkers = new LinkedList<WorkerThread>();
提交方法
public boolean submit(Runnable runnable) {
if (runnable == null) {
return false;
}
synchronized (Lock) {
handoffPending = true;
// Wait until a worker thread is available
while ((availWorkers.size() < 1) && !isShutdown) {
try {
Lock.wait(500);
} catch (InterruptedException ignore) {
}
}
if (!isShutdown) {
WorkerThread wt = (WorkerThread)availWorkers.removeFirst();
busyWorkers.add(wt);
wt.run(runnable);
} else {
// If the thread pool is going down, execute the Runnable
// within a new additional worker thread (no thread from the pool).
WorkerThread wt = new WorkerThread(this, threadGroup,
"WorkerThread-LastJob", prio, isMakeThreadsDaemons(), runnable);
busyWorkers.add(wt);
workers.add(wt);
wt.start();
}
Lock.notifyAll();
}
return true;
}
**是否有可能有主线程(即提交这些任务)暂停直到线程池中的线程变为可用**它甚至不可能任何人说没有代码的东西? – ShayHaned