线程池
- 线程池
- 七个参数
BlockingQueue workQueue=new ArrayBlockingQueue(10);//最多存放10个任务 ThreadFactory threadFactory= Executors.defaultThreadFactory(); //回抛出异常的回绝策略 RejectedExecutionHandler reh=new ThreadPoolExecutor.AbortPolicy(); ExecutorService es = new ThreadPoolExecutor(5,10,300L,TimeUnit.MILLISECONDS,workQueue,threadFactory,reh); //线程池管理线程对象 es线程池对象可以接受线程任务
- 核心参数
- 最大线程数
- 存活时间
- 时间单位
- 工作(任务队列)
- 线程工厂
- 拒绝策略
- Java线程池中有两种提交任务的方式:execute()和submit()。这两种方式的主要区别如下:
- 任务类型:execute()方法只能接收Runnable类型的参数,而submit()方法可以接收Runnable和Callable两种类型的参数。
- 返回值:execute()方法没有返回值,而submit()方法提交任务后会有一个Future类型的返回值。当任务类型为Runnable时,返回值为null。
- 异常处理:execute()在执行任务时,如果遇到异常会直接抛出。而submit()不会直接抛出异常,只有在使用Future的get方法获取返回值时,才会抛出异常。
- 线程池的工作流程
- 如果存活线程数超过核心线程数量,当有些线程空闲后,没有任何的工作任务,就会等待最大存活时间;
- 如果超过最大存活时间依然没有任务产生,线程池就会消亡此线程,直到存活线程数量达到核心线程数量;
- 如果存活的线程数量达到线程池最大线程数量,并且所有的线程都在工作,现在添加新的工作任务;
- 四种回绝策略
- 抛出异常;
- 抛异常并记录日志;
- 静默放弃当前任务(不抛异常,不做任何的处理);
- 放弃掉队列中最老的任务,将当前任务加入到队列中;
- 线程同步
- synchronized同步锁 ,可重入的;
- lock(可以实现公平锁和非公平锁)
static Lock lock=new ReentrantLock(); public static void easy(){ lock.lock();//使用锁 System.out.println("----start---"+Thread.currentThread().getName()+"-----"); try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("----end---"+Thread.currentThread().getName()+"-----"); lock.unlock();//解锁 }
- ReadWriteLock
static ReadWriteLock rwLock=new ReentrantReadWriteLock(); //ReadWriteLock这个对象管理两把锁 read锁(共享锁) write锁(独占锁) public static void easy1(){ Lock rlock = rwLock.readLock(); System.out.println(rlock); rlock.lock();//加读锁 System.out.println("---read---"+Thread.currentThread().getName()+"-----start"); System.out.println(); }
- lock.tryLock() 尝试获得锁对象