概述

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

  • Executor

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

  • ExecutorService

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

  • ScheduledExecutorService

可延时执行线程任务

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

public class ThreadDemo implements Runnable{
private String threadName = null;
private boolean flag = true;
private int count;
private int counter;
private long suspend; /**
* This is the constructor
* @param threadName
* @param count 循环次数
* @param suspend 线程终端时间,单位毫秒
*/
public ThreadDemo(String threadName, int count, long suspend) {
super();
this.threadName = threadName;
this.count = count;
this.suspend = suspend;
} /**
* run
*/
@Override
public void run() {
while (flag) {
try {
Thread.sleep(suspend);
System.out.println(threadName+"--------------"+counter);
counter++;
if(counter>count){
flag = false;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

创建一个无限大的线程池

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

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

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

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

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

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

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

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

创建定时单线程池

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

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

最新文章

  1. 不会JavaScript能混前端么?能拿到高薪么?
  2. [转载] Win PE内安装Windows 7原版镜像 / 安装程序无法创建新的系统分区,也无法定位现有的系统分区
  3. Servlet/JSP-02 Servlet相关类
  4. 高仿Windows Phone QQ登录界面
  5. MySQL的诡异同步问题-重复执行一条relay-log
  6. jq实现多级手风琴效果
  7. 传递给函数的隐含参数:arguments及递归函数的实现
  8. matlab函数之bsxfun
  9. Oracle经典书籍推荐
  10. C#后台发送HTTP请求
  11. Linux中nmon的安装与使用【转】
  12. 数据库复习总结(2)-SQLServer的管理
  13. 阿里云centos7成功安装和启动nginx,但是外网访问不了的解决方案
  14. CentOS安装Python3.7
  15. A1126. Eulerian Path
  16. Linux搭建禅道
  17. 获取cxgrid footer内容
  18. 用.native修饰器来对外部组件进行构造器内部方法的调用以及用原生js获取构造器里的方法
  19. An error was encountered while running(Domain=LaunchSerivcesError, Code=0)
  20. python代码在IDE下调试设置命令行参数

热门文章

  1. C# 开发者审查代码的41条建议
  2. ILMerge将源DLL合并到目标EXE
  3. ASP.NET Core2,通过反射批量注入程序集
  4. 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Latin1_General_100_CI_AS" 之间的排序规则冲突。
  5. LNMP下安装memcache
  6. 解决input为number类型时maxlength无效的问题
  7. HTML利用posotion属性定位 小技巧
  8. 语义化的HTML及其目的
  9. opencv3.2.0图像处理之方框滤波boxFilter API函数
  10. Android 运行时权限处理(from jianshu)