- 线程池
- Executor接口为执行线程池中的任务,ExecutorService接口为管理和控制任务,ExecutorService是Executor的子类。
- 为了得到一个Executor对象,可使用Executors类(注意和Executor接口不同)中的两种static方法,newFixedThreadPool(int n)和newCachedThreadPool().
- newFixedThreadPool(int n)方法产生一个固定线程个数的线程池,当一个现在执行的任务结束的时候,该线程可以被另外一个任务使用。newCachedThreadPool()方法生成一个线程池按需产生线程,同样可以复用已有的闲置线程。
import java.util.concurrent.*; public class ExecutorDemo{ //产生一个最多有三个线程的固定线程池 ExecutorService executor = Executors.newFixedThreadPool(3); //TaskA, TaskB, TaskC分别是三个runnable的类 executor.execute(new TaskA()); executor.execute(new TaskB()); executor.execute(new TaskC()); //Executor类型使用完,记得要关闭 executor.shutdown(); }
- 线程池用完记得要shutdown();
- 可以使用一个技巧,等待所有线程池中线程执行完毕之后再往后执行代码:
... executor.shutdown();//此时只是通知系统可以关闭线程池,必须等线程池中所有线程执行完毕,才会真正关闭线程。 //只有所有线程执行完毕,这个循环才会跳出 while(!executor.isTerminated)(){ } .....//之后的代码
- 可以使用线程池的方式,让所有线程按照想要的顺序进行:
这样,让线程池中只有一个线程。那么,一定是先执行FirstTask,执行完毕后再执行SecondTask,最后ThirdTask。用Semaphore类也可以实现这个功能,详见《Carcking the coding interview》5th edition, 16.5ExecutorService executor = Executors.newFixedThreadPool(1); executor.execute(st.new FirstTask()); executor.execute(st.new SecondTask()); executor.execute(st.new ThirdTask()); executor.shutdown();
- Lock与Condition
- condition中的方法sleep()和await(),sleep不会交出lock,await会交出lock
多线程(Multithreading)
最新推荐文章于 2023-05-15 00:00:00 发布