2012-04-28 4 views
3

Пул потоков, как и любые службы ExecutorServices, мы определили newFixedPool размера 3. Теперь у меня очередь из 10000 выполняемых задач. Для выполнения указанного выше процесса у меня есть эти сомнения -Точно, какой пул потоков в Java работает?

  1. Для выполнения указанного выше процесса, является исполнителем даст только 3 темы от queus задач для запуска в одном кадре?

  2. Пул будет нести 3 нити, и эти 3 потока будут отвечать только за выполнение всех 10000 задач. Если это правильно, как в одном потоке выполняются разные выполняемые задачи, так как в конечном итоге эти задачи также являются самими потоками, и в середине выполнения любого из заданий/задач вы можете назначить новую ответственность для потока пулов.

ответ

5
  1. Да, в лучшем случае только 3 нити будет в бассейне сразу, если на самом деле вы используете Executors.newFixedThreadPool(3)

  2. 10000 задачи не Threads они просто Runnables. A Thread должен быть запущен через Thread#start, чтобы фактически создать системную нить. Задачи (экземпляры Runnable) размещены в BlockingQueue. Темы из пула потоков будут опросить BlockingQueue для запуска задачи. Когда они завершают задачу, они возвращаются в очередь, чтобы получить другую. Если добавлено больше задач, они вставляются в BlockingQueue в соответствии с правилами реализации этой очереди. Для большинства очередей это First-In-First-Out, но PriorityQueue фактически использует Comparator или естественный порядок сортировки задач по мере их вставки.

0

Ниже customThreadPool в Java, которые принимают noofThreads и MaxConcurrentTask. Также имеется остановка(), чтобы остановить завершение ThreadPool

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.LinkedBlockingQueue; 


@SuppressWarnings("all") 
public class ThreadPool { 


    private BlockingQueue taskQueue = null; 
    private List<PoolThread> threads = new ArrayList<PoolThread>(); 
    private boolean isStopped = false; 

    public ThreadPool(int noOfThreads, int maxNoOfTasks) { 
     taskQueue = new LinkedBlockingQueue(maxNoOfTasks); 
     for(int i=0; i<noOfThreads; i++) {  
      threads.add(new PoolThread(taskQueue)); 
     } 

     for(PoolThread thread : threads) {  
      thread.start(); 
     } 
    } 

    public synchronized void execute(Runnable task) { 

     if(this.isStopped) 
      throw new IllegalStateException("ThreadPool is stopped"); 

     this.taskQueue.offer(task); 
    } 

    public synchronized void stop() { 
     this.isStopped = true; 
     for(PoolThread thread : threads) {  
      thread.stopMe(); 
     } 
    } 
} 


@SuppressWarnings("all") 
class PoolThread extends Thread { 

    private BlockingQueue taskQueue = null; 
    private boolean  isStopped = false; 
    public PoolThread(BlockingQueue queue) { 
     taskQueue = queue; 
    } 

    public void run() { 
     while(!isStopped()) { 
      try {  
       Runnable runnable = (Runnable) taskQueue.poll(); 
       runnable.run();  
      } catch(Exception e) {  
       //log or otherwise report exception,  //but keep pool thread alive. 

      }  
     } 
    } 

    public synchronized void stopMe() { 
     isStopped = true; 
     this.interrupt(); 
     //break pool thread out of dequeue() call. 
    } 

    public synchronized boolean isStopped() { 
     return isStopped; 
    } 
} 
Смежные вопросы