进一步谈谈多线程编程一些细节的使用;涉及到线程通信的一些知识;以及线程池的使用
Q:两个线程,当线程1满足条件A时,线程2能够及时知道并且做出相应的动作,如何实现?
1 | public class WayOne{ |
线程t2在list元素满50时,将t1线程终止,t2线程启动之前一直是处于运行中轮询list.size;
1 | public class WayTwo{ |
注意:wait 和 notify都是object对象自身就有的方法,需要配合synchronized一起使用,运行效果可以看出,有”通知不及时的问题”,当size==50的时候,t2并没有及时的do t2 things;而是等到t1运行结束,再do t2 things;原因是,object.wait()阻塞并且释放锁,能够让t1线程获取到object锁运行,但是object.notify()并不会释放锁,所有必须等到t1运行结束,t2继续;
1 | public class WayThree{ |
注意:countDownLatch.await();阻塞以后,知道countDownLatch.countDown()执行n次–对应CountDownLatch(n)的n;能够及时得到通知;
Q:如何用线程实现一个队列的功能,一个负责放入,一个负责取出
1 | public class MyQueue{ |
线程池的使用
列举如下四种常见的线程池:了解即可,一般不会直接这么创建线程池,都在自定义参数的;
1 | ExecutorService executorService1 = Executors.newCachedThreadPool(); |
他们都是实现了下面的接口:
1 | new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) |
注意:在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,若大于corePoolSize,则会将任务加入队列, 若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程,若线程数大于maximumPoolSize,则执行拒绝策略。maximumPoolSize,包括了corePoolSize正在运行的线程
所以,可以看出默认的四种常见线程池创建的时候,特殊情况下会造成内存溢出问题
executorService1中,没有限制线程的数量,所以会一直创建线程
executorService2中,使用无界队列,请求会一直堆积到队列中
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/09/07/java2-2/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!