概述

首先来说一说java连接池中常用到的几个类:Executor,ExecutorService,ScheduledExecutorService

  • Executor

执行已经提交的任务对象。此接口提供了将任务提交和任务执行分离的机制。

  • ExecutorService

它是Executor的子接口,可以终止提交新的线程任务,可以中式线程池里现有的所有线程,还可以批量提交线程任务等。它的方法有很多,可以详细阅读相关的api。

  • ScheduledExecutorService

可延时执行线程任务

本文中案例中的线程实现如下:

  1. public class ThreadDemo implements Runnable{
  2. private String threadName = null;
  3. private boolean flag = true;
  4. private int count;
  5. private int counter;
  6. private long suspend;
  7.  
  8. /**
  9. * This is the constructor
  10. * @param threadName
  11. * @param count 循环次数
  12. * @param suspend 线程终端时间,单位毫秒
  13. */
  14. public ThreadDemo(String threadName, int count, long suspend) {
  15. super();
  16. this.threadName = threadName;
  17. this.count = count;
  18. this.suspend = suspend;
  19. }
  20.  
  21. /**
  22. * run
  23. */
  24. @Override
  25. public void run() {
  26. while (flag) {
  27. try {
  28. Thread.sleep(suspend);
  29. System.out.println(threadName+"--------------"+counter);
  30. counter++;
  31. if(counter>count){
  32. flag = false;
  33. }
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }

创建一个无限大的线程池

  1. ExecutorService executorService1 = Executors.newCachedThreadPool();
  2. executorService1.execute(new ThreadDemo("线程B-1", 5, 200));
  3. executorService1.execute(new ThreadDemo("线程B-2", 5, 200));
  4. executorService1.shutdown();
  5. executorService1.shutdown()作用是拒绝接收其它的线程,在线程池里的线程都执行完后,关闭线程池。

创建一个特定大小的线程池

  1. ExecutorService executorService1 = Executors.newFixedThreadPool(2);
  2. executorService1.submit(new ThreadDemo("线程B-1", 5, 200));
  3. executorService1.submit(new ThreadDemo("线程B-2", 5, 200));
  4. executorService1.submit(new ThreadDemo("线程B-3", 5, 200));
  5. executorService1.shutdown();
  6.  
  7. 这里创建的线程池大小为2,若是提交的线程个数大于2,多余的则会在队列里等候

创建一个单线程执行的线程池

  1. ExecutorService executorService1 = Executors.newSingleThreadExecutor();
  2. executorService1.execute(new ThreadDemo("线程A-1", 5, 200));
  3. executorService1.execute(new ThreadDemo("线程A-2", 5, 200));
  4. executorService1.shutdown();
  5.  
  6. 可提交多个线程,但一次只运行一个线程,其它的在队列里等待

创建延迟执行线程的的线程池

  1. ScheduledExecutorService executorService1 = Executors.newScheduledThreadPool(2);
  2. executorService1.schedule(new ThreadDemo("线程B-1", 5, 500),1,TimeUnit.SECONDS);
  3. executorService1.schedule(new ThreadDemo("线程B-2", 5, 500),2,TimeUnit.SECONDS);
  4. executorService1.schedule(new ThreadDemo("线程B-3", 5, 500),3,TimeUnit.SECONDS);
  5. executorService1.shutdown();

关于Executors.newScheduledThreadPool(int corePoolSize)中的corePoolSize:当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。

创建定时单线程池

  1. ScheduledExecutorService executorService1 = Executors.newSingleThreadScheduledExecutor();
  2. executorService1.schedule(new ThreadDemo("线程A-1", 5, 500),1,TimeUnit.SECONDS);
  3. executorService1.schedule(new ThreadDemo("线程A-2", 5, 500),2,TimeUnit.SECONDS);
  4. executorService1.shutdown();

每个类有什么方法,看具体的api,以上只是语法范例。

Java并发:Executor与连接池的更多相关文章

  1. java并发实战:连接池实现

    池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的,这 ...

  2. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  3. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  5. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  6. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  7. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  10. Java自己动手写连接池三

    Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...

随机推荐

  1. Ionic3 UI组件之 ImageLoader

    ImageLoader:通过后台线程加载图片(异步)并缓存.类似于Glide或者Picasso. 组件特性: 后台线程下载图片,下载速度更快,不使用webview的资源: 缓存图像.图像将在您下次显示 ...

  2. [转]数据库中Schema(模式)概念的理解

    在学习数据库时,会遇到一个让人迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等. 如果把database看作是一个仓库,仓库很多 ...

  3. Xshell基础入门

    启动 双击快捷方式,启动 新建回话 建立连接 在这里需要填写的是: 1. 连接名称 2. 服务器IP 3. 服务器端口(默认22) 填写完毕后,点击确定,保存配置,回到连接页面,可以看到多了一个测试服 ...

  4. 前端(十):使用redux管理数据

    react本身能够完成动态数据的监听和更新,如果不是必要可以不适用redux. 安装redux: cnpm install redux --save,或者yarn add redux. 一.react ...

  5. SpingMVC_注解式开发_接收请求参数

    一.逐个接收 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotat ...

  6. ZAB 算法

    ZAB (Zookeeper Atomic Broadcast )  zookeeper原子消息广播协议 保证:分布式数据一致性  所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 ...

  7. MVC 使用Quartz.Net组件实现定时计划任务

    最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...

  8. CSS样式之a标签(原文网址http://www.divcss5.com/shili/s57.shtml)

    这是个人在做网站的时候整理的关于a标签的使用方法,整理一下,方便下次使用. 一.a超链接的代码 <a href="http://www.baidu.com" target=& ...

  9. 【MUI框架】学习笔记整理 Day 2

    参考整理自MUI官网 http://dev.dcloud.net.cn/mui/ui/ (1)numbox(数字输入框) mui提供了数字输入框控件,可直接输入数字,也可以点击“+”.“-”按钮变换当 ...

  10. 或许你并不需要jQuery

    此文为翻译文章,原文链接:you might not need jquery jQuery 和它的相关插件都是很强大的,使用它们让我们的应用开发变得简单.如果你正在开发另一个库,请花点时间思考以下,你 ...