源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java 线程池框架

  • 时间:2022-11-17 01:07 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java 线程池框架
[b]一、线程池结构图[/b] [img]http://files.jb51.net/file_images/article/201702/2017020815573437.png[/img] [b]二、示例[/b] 定义线程接口
public class MyThread extends Thread {
 @Override
 publicvoid run() {
 System.out.println(Thread.currentThread().getName() + "正在执行");
 }
}
[b]1:newSingleThreadExecutor[/b]
ExecutorService pool = Executors. newSingleThreadExecutor();
 Thread t1 = new MyThread();
 Thread t2 = new MyThread();
 Thread t3 = new MyThread();
 //将线程放入池中进行执行
 pool.execute(t1);
 pool.execute(t2);
 pool.execute(t3);
 //关闭线程池
 pool.shutdown();
输入结果:
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行
[b]2:newFixedThreadPool[/b]
ExecutorService pool = Executors.newFixedThreadPool(3);
Thread t1 = new MyThread();
 Thread t2 = new MyThread();
 Thread t3 = new MyThread();
 Thread t4 = new MyThread();
 Thread t5 = new MyThread();
 //将线程放入池中进行执行
 pool.execute(t1);
 pool.execute(t2);
 pool.execute(t3);
 pool.execute(t4);
 pool.execute(t5);
pool.shutdown();
输入结果:
pool-1-thread-1正在执行
pool-1-thread-2正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
[b]3 :newCachedThreadPool[/b]
ExecutorService pool = Executors.newCachedThreadPool();
 Thread t1 = new MyThread();
 Thread t2 = new MyThread();
 Thread t3 = new MyThread();
 Thread t4 = new MyThread();
 Thread t5 = new MyThread();
 //将线程放入池中进行执行
 pool.execute(t1);
 pool.execute(t2);
 pool.execute(t3);
 pool.execute(t4);
 pool.execute(t5);
 //关闭线程池
 pool.shutdown();
输入结果:
pool-1-thread-2正在执行
pool-1-thread-4正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-5正在执行
[b]4 :ScheduledThreadPoolExecutor[/b]
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
  @Override
  public void run() {
   //throw new RuntimeException();
   System.out.println("================");
  }
 }, 1000, 2000, TimeUnit.MILLISECONDS);
pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
  @Override
  public void run() {
   System.out.println("+++++++++++++++++");
  }
 }, 1000, 2000, TimeUnit.MILLISECONDS);
输入结果:
================
+++++++++++++++++
+++++++++++++++++
+++++++++++++++++
[b]三、线程池核心参数[/b] corePoolSize : 池中核心的线程数 maximumPoolSize : 池中允许的最大线程数。 keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。 unit : keepAliveTime 参数的时间单位。 workQueue : 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。 threadFactory : 执行程序创建新线程时使用的工厂。 handler : 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。 ThreadPoolExecutor :Executors类的底层实现。 [b]3.1 任务排队机制[/b] SynchonousQueue: 同步队列,队列直接提交给线程执行而不保持它们,此时线程池通常是无界的 LinkedBlockingQueue: 无界对列,当线程池线程数达到最大数量时,新任务就会在队列中等待执行,可能会造成队列无限膨胀 ArrayBlockingQueue : 有界队列,有助于防止资源耗尽,一旦达到上限,可能会造成新任务丢失 [b]注意:[/b] newSingleThreadExecutor、newFixedThreadPool使用的是LinkedBlockingQueue newCachedThreadPool 使用的是 SynchonousQueue newScheduledThreadPool使用的是 DelayedWorkQueue [b]3.2 线程执行流程[/b] [img]http://files.jb51.net/file_images/article/201702/2017020815573438.jpg[/img] [b]3.3 线程大小确定:[/b] cpu密集型: 尽量少开线程,最佳线程数 Ncpu+1 io密集型:多开线程,2Ncpu 混合型:根据情况而定,可以拆分成io密集和cou密集 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程素材网!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部