2017-06-22 84 views
0

我正在研究一个基于Java的程序,该程序从文件读取并将每行发送到其自己的处理Runnable中以执行一些单线程计算。我正在使用一个固定的线程池,每个可用内核有一个任务来并行化这个。该文件非常庞大,在提交作业时无法将每个文件加载到内存中。是否有可能让主线程(即提交这些任务)暂停直到线程池中的线程变为可用?修复线程池:暂停直到线程可用?

+0

**是否有可能有主线程(即提交这些任务)暂停直到线程池中的线程变为可用**它甚至不可能任何人说没有代码的东西? – ShayHaned

回答

1

创建一个简单的线程池,其可用工作线程与池大小相同。提交前检查是否有可用线程,然后提交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; 
     }