【问题标题】:Fixed thread pool: pause until thread available? [duplicate]固定线程池:暂停直到线程可用? [复制]
【发布时间】:2017-11-26 00:13:00
【问题描述】:

我正在开发一个基于 Java 的程序,该程序从文件中读取数据并将每一行发送到它自己的处理 Runnable 中以进行一些单线程计算。我正在使用一个固定的线程池,每个可用核心一个任务来并行化它。该文件很大,提交作业时无法将每个文件加载到内存中。是否可以让主线程(即提交这些任务)暂停,直到线程池中的线程可用?

【问题讨论】:

  • 是否可以让主线程(即提交这些任务)暂停,直到线程池中的线程可用 任何人都不可能说什么没有代码??

标签: java multithreading threadpool threadpoolexecutor


【解决方案1】:

使用与池大小相同的可用工作线程创建一个简单的线程池。在提交之前检查是否有可用线程,然后提交,否则等待锁定。

你也可以使用 Semaphore,它会阻塞直到 acquire() 得到一些值。 信号量示例:

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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多