2017-06-22 2 views
0

私は、ファイルから読み込んで、各行を独自の処理Runnableに送信して、単一スレッドの計算を行うJavaベースのプログラムに取り組んでいます。私は固定スレッド・プールを使用しています。使用可能なコアごとに1つのタスクがあり、これを並列化しています。ファイルは膨大で、ジョブを送信するときには、それぞれをメモリに読み込むことができません。スレッドプール内のスレッドが使用可能になるまで、メインスレッド(これらのタスクをサブミットしている)を一時停止させることは可能ですか?固定スレッドプール:スレッドが使用可能になるまで一時停止しますか?

+0

を提出**は、それがメインスレッド(つまり、これらのタスクを提出している)を持つことが可能です一時停止スレッドプール内のスレッドが利用可能になるまで**実際には誰もコードなしで何かを言うことさえできませんか? – ShayHaned

答えて

1

利用可能なワーカースレッドがプールサイズと同じである単純なスレッドプールを作成します。使用可能なスレッドが存在するかどうかを確認してから、ロックを待機します。

また、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; 
     } 
関連する問題