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遍呢

解决方案 »

  1.   

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

  2.   

    因为第一个线程执行完了 开始执行第二个线程  这是线程池也只有一个线程 你的明白 ?
    如果要看的仔细一点  你可以在RUN 里面加SLEEP~
      

  3.   

    没有格式化和有颜色标识的代码比较难看。
    建议楼主发布时将代码放入[code]标签中。
    在你输入的时候,上面有一排快捷方式。点击#那个东西可以选择语言的。
      

  4.   

    5个线程都已经执行过了,只是每次只能执行1个线程。
    并没有并发的情况,pool-1-thread-1的个数是线程的并发数。
      

  5.   

    楼主先要知道启动一个线程是通过调用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()...就知道了。  
      

  6.   

    谢谢楼上各位,我说说看自己的理解,看看对不对,就是线程池是放置线程的地方。而出现一个任务,就会去线程池中去拿一个线程出来执行任务。由于现在线程池只能放置一个线程,而放入线程池的线程又是不固定的,假设放入的是1线程,当出现任务的时候,那个任务就会去执行1线程,执行完任务后就会把1线程放回去线程池,那么我不明白的是 pool.execute(t2);  这句就是开启一个新任务吗?为什么写执行线程2,难道这个也会去线程池中取线程1去执行任务吗
      

  7.   

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

  8.   

    不是线程池http://debugs.tk/?post=83