概述

首先来说一说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,以上只是语法范例。

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. HTML5中Access-Control-Allow-Origin解决跨域问题

    www.111cn.net 更新:2015-01-07 编辑:flyfox 来源:转载 跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Acc ...

  2. bootstrap、qjuery、插件 、字体网页

    http://www.bootcss.com/ 前端框架bootstrap http://www.fontawesome.com.cn/faicons/ 字体图标库 https://daneden.g ...

  3. C#:ORM--实体框架EF(entity framework)(1)

    本文来自:http://www.cnblogs.com/xuf22/articles/5513283.html 一.什么是ORM ORM(Object-relational mapping),中文翻译 ...

  4. ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 问题修改

    ubuntu 常见错误–Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx或者apt-get update时出 ...

  5. 百度AI人脸识别的学习总结

    本文主要分以下几个模块进行总结分析 项目要求:运用百度AI(人脸识别)通过本地与外网之间的信息交互(MQService),从而通过刷脸实现登陆.签字.会议签到等: 1.准备工作: 内网:单击事件按钮— ...

  6. 比较ArrayList和LinkedList的异同

    1.ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构: 2.对于随机访问get和set,ArrayList要优于LinkedList; 3.对于添加和删除操 ...

  7. vue项目引入element

    前提工作-安装并配置好以下环境: 1.安装node  2.安装git 1.初始化项目 vue init webpack vue-elementui npm run dev 2.安装element np ...

  8. BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)

    题意 题目链接 Sol 介绍一种神奇的点分治的做法 啥?这都有根树了怎么点分治?? 嘿嘿,这道题的点分治不同于一般的点分治.正常的点分治思路大概是先统计过重心的,再递归下去 实际上一般的点分治与统计顺 ...

  9. drupal smtp could not connect to smtp

    情况说明: 使用了SMTP Authentication Support 模块. 配置都没问题,是从另一台服务器迁过来的网站和数据库. 原因是客户的smtp服务器限制了我们新服务器的IP. 验证方式t ...

  10. OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)

    http://blog.csdn.net/o_sun_o/article/details/8351037 BMP文件格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称 ...