用户写线程有两种方式:
- 方式一:
用户自己写线程
Runnable r=newRunnable(){重写run方法}
Thread t1=new Thread(r);
Thread t2=new Thread(r);
t1=new Thread();
...
用户要自己控制线程对象的作用域
相当于用户自己来管理线程
- 方式二:
Java给提供了一个线程池的概念
线程池
把若干用户线程,添加到线程池中,有线程池来管理线程
为什么使用线程池
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复使用或利用,可以并发执行多个任务
- 可以根据系统的承受能力,调整线程池中的额工作线程的数目,防止因为消耗过多的内存,而使服务器宕机(down)
- 结论:就是Java给提供了一个写api的方法,用于更好的管理线程,让程序员主要用于写线程的逻辑
线程池的使用:
有一个Executors的工具类,此类提供了若干静态方法,这些静态方法用于生成线程池的对象
- Executors.newSingleThreadExecutor();
创建一个单线程的线程池,这个线程池只有一个线程在工作,即,单线程执行任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来代替他,因此线程池保证所有的任务是按照任务的提交顺序来执行 - Executors.newFixedThreadPool();
创建一个固定大小的线程池,每次提交一个任务就创建一个线程,直到线程到达线程池的最大大小,线程的大小一旦达到最大值,就会保持不变,如果某个线程因为执行异常而结束,那么线程池就会补充一个新的线程 - Executors.newCachedThreadPool();
创建一个可以缓冲的线程池,如果线程的大小超过了处理的任务所需要的线程,那么就会瘦部分的线程,当任务的数量增加的时候,此线程池不会对线程池的大小做限定,线程池的大小完全依赖于操作系统能够创建的最大的大小 - Executors.newScheduledThreadPool();
创建一个大小无限制的线程池,次线程池支持定时以及周期性的执行任务的需求