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是一个任务。