Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

线程池原理-ThreadPoolExecutor PDF 下载


分享到:
时间:2020-11-20 10:09来源:http://www.java1234.com 作者:小锋  侵权举报
线程池原理-ThreadPoolExecutor PDF 下载
失效链接处理
线程池原理-ThreadPoolExecutor PDF 下载

本站整理下载:
 
相关截图:


主要内容:

创建线程池 ExecutorService service = Executors.newFixedThreadPool(1); 1.构造方法及参数 public ThreadPoolExecutor( int corePoolSize, //核心线程数 int maximumPoolSize, //最大线程数 long keepAliveTime, //空闲超时时间 TimeUnit unit, //时间单位 BlockingQueue<Runnable> workQueue, //工作队列 ,阻塞对列 ThreadFactory threadFactory, //线程工厂 RejectedExecutionHandler handler //拒绝策略 ) { } 2.阻塞对列: BlockingQueue<Runnable> 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过 这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。 BlockingQueue的核心方法 public interface BlockingQueue<E> extends Queue<E> { //将给定元素设置到队列中,如果设置成功返回true, 否则返回false。如果是往限定了长度的队列中设 置值,推荐使用offer()方法。 boolean add(E e); //将给定的元素设置到队列中,如果设置成功返回true, 否则返回false. e的值不能为空,否则抛出空指 针异常。boolean offer(E e); //将元素设置到队列中,如果队列中没有多余的空间,该方法会一直阻塞,直到队列中有多余的空间。 void put(E e) throws InterruptedException; //将给定元素在给定的时间内设置到队列中,如果设置成功返回true, 否则返回false. boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; //从队列中获取值,如果队列中没有值,线程会一直阻塞,直到队列中有值,并且该方法取得了该值。
E take() throws InterruptedException; //在给定的时间里,从队列中获取值,时间到了直接调用普通的poll方法,为null则直接返回null。 E poll(long timeout, TimeUnit unit) throws InterruptedException; //获取队列中剩余的空间。 int remainingCapacity(); //从队列中移除指定的值。 boolean remove(Object o); //判断队列中是否拥有该值。 public boolean contains(Object o); //将队列中值,全部移除,并发设置到给定的集合中。 int drainTo(Collection<? super E> c); //指定最多数量限制将队列中值,全部移除,并发设置到给定的集合中。 int drainTo(Collection<? super E> c, int maxElements); } 3.线程工厂: DefaultThreadFactory 线程创建有两种方式 继承类Thread 实现 Runnable //这里通过Runnable形式创建 static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "pool‐" + poolNumber.getAndIncrement() + "‐thread‐"; }public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t;
} } 4.拒绝策略: RejectedExecutionHandler //默认为中止策略 private static final RejectedExecutionHandler defaultHandler = new AbortPolicy(); 四种线程池拒绝策略 1.AbortPolicy中止策略 2.DiscardPolicy抛弃策略 3.DiscardOldestPolicy抛弃旧任务策略 4.CallerRunsPolicy调用者运行 当然也可以自定义线程池策略 implements RejectedExecutionHandler //AbortPolicy:饱和时会抛出RejectedExecutionException(继承自RuntimeException),调用者可 捕获该异常自行处理 public static class AbortPolicy implements RejectedExecutionHandler { public AbortPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString()); } }//DiscardPolicy:不做任何处理直接抛弃任务 public static class DiscardPolicy implements RejectedExecutionHandler { public DiscardPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }//DiscardOldestPolicy:先将阻塞队列中的头元素出队抛弃,再尝试提交任务 public static class DiscardOldestPolicy implements RejectedExecutionHandler { public DiscardOldestPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); e.execute(r); } } }//CallerRunsPolicy:既不抛弃任务也不抛出异常,直接运行任务的run方法,换言之将任务回退给调用 者来直接运行 public static class CallerRunsPolicy implements RejectedExecutionHandler { public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); } } } 5.执行线程 Executor //创建线程池 ExecutorService service = Executors.newFixedThreadPool(1); //执行 service.execute(new Runnable() { @Override public void run() { System.out.println("执行"); } })
 
------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐