日期:2014-05-20  浏览次数:20995 次

java线程池
public class Core {
public static void main(String[] args){
ExecutorService pool = Executors.newFixedThreadPool(1);

//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 
  Thread t1 = new MyThread(); 
  Thread t2 = new MyThread(); 
  Thread t3 = new MyThread(); 
  Thread t4 = new MyThread(); 
  Thread t5 = new MyThread(); 
  //将线程放入池中进行执行 
  pool.execute(t1); 
  pool.execute(t2); 
  pool.execute(t3); 
  pool.execute(t4); 
  pool.execute(t5); 
  //关闭线程池 
  pool.shutdown(); 
}
}

class MyThread extends Thread{ 
  @Override 
  public void run() { 
  System.out.println(Thread.currentThread().getName()+"正在执行。。。"); 
  } 
}
为什么打印的结果是

pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
线程池的大小是1,那么线程1执行完成了后,就应该执行别的线程了呀,为什么线程1会打印5遍呢

------解决方案--------------------
ExecutorService pool = Executors.newFixedThreadPool(1);
这句决定了打印结果
线程池中只有一个线程,所以一直是1
这个1和线程名没关系,是线程池中线程编号
改为2、3试试,就会发现了这个问题了~

------解决方案--------------------
楼主先要知道启动一个线程是通过调用Thread实例的start()方法,所以Thread t1 = new MyThread()并没有执行其 run 方法(就是没有执行任务)。

再者就是线程池有线程,线程是用来执行任务的(就是Runnable)。 线程池的大小是1,也就是只有一个线程,pool.execute(t1)就是用线程池中的这个线程来执行t1这个任务(调用其 run 方法),并不是启动t1,由t1来运行 run 方法。

结果就清楚了,t1, t2, t3, t4, t5都是由线程池中的那个线程来执行他们的任务。

万一想不通,也很简单,你把t1.start(),t2.start(),t3.start()...就知道了。



  

------解决方案--------------------
ExecutorService pool = Executors.newFixedThreadPool(1);
线程池pool是工厂,这个工厂里面只有一个干活的工人,工人就是线程池里面的工作线程。
pool.execute(t1); 
从工厂里面把唯一的那个工人拿出来执行任务。
此时的t1是一个任务。