1、为什么要创建线程池?
1) java中一个请求创建一个线程,他的创建和销毁开销是很大的,如果在jvm中创建太多线程会过度消耗内存导致内存不足。
2) 活动的线程是消耗资源的,如果线程的数量得不到限制,那么当服务端与很多客户端通信,会创建大量的线程,导致内存空间不足,影响使用。
2、Executor
帮助开发人员有效地进行线程控制。
1) newFixedThreadPool()方法,该方法返回一个固定数量的线程池。当有个一任务提交时,若线程池中空闲则立刻执行,若没有,会被暂缓在一个任务队列中等待有空闲的线程去执行。
2) newSingleThreadExecutor()方法,创建一个线程的线程池,若空闲执行,若没有,暂缓到任务队列中等待执行。
3) newCachedThreadPool()方法,返回一个可根据实际情况吊证线程个数的线程池,不限制最大线程数量,若有空闲线程,执行,没有创建。并且每个空闲线程会在60秒钟自动回收。
4) newScheduledThreadPool()方法,该方法返回一个ScheduledExecutorService对象,但该线程池可以指定线程池的数量。
5) 自定义线程池:
public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(1,2,60, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3), new ThreadPoolExecutor.DiscardOldestPolicy()); Task task1 = new Task("一号窗口:"); Task task2 = new Task("二号窗口:"); Task task3 = new Task("三号窗口:"); Task task4 = new Task("四号窗口:"); Task task5 = new Task("五号窗口:"); Task task6 = new Task("六号窗口:"); executor.execute(task1); executor.execute(task2); executor.execute(task3); executor.execute(task4); executor.execute(task5); executor.execute(task6); }
一、继承Thread类和实现Runnable接口创建线程的区别?
java支持单继承多实现,在实现runnable接口用Thread构造方法创建线程时,可以共享一个runnable对象,可实现资源共享。
而Thread不行,需要去定义静态变量。一个是多线程分别去完成自己的任务,一个是多个线程共同完成一个任务。