Java并发:Executor与连接池
概述
首先来说一说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与连接池的更多相关文章
- java并发实战:连接池实现
池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的,这 ...
- 13、Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 【转】Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java自己动手写连接池四
Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...
- Java自己动手写连接池三
Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...
随机推荐
- C#中Cookie,Session,Application的用法与区别?
1.Application 储存在服务端,没有时间限制,服务器关闭即销毁(前提是自己没写销毁方法) 2.Session 储存在服务端,客户端(浏览器)关闭即销毁(若长时间不使用 且 浏览器未关闭的情况 ...
- win10 uwp 商业游戏
本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ...
- JAVA实现加入收藏和设为首页---网摘
JS:加入收藏夹<script language="javascript">function bookmark(){window.external.AddFavorit ...
- git 入门学习
1. 分享一个我自己的百度网盘地址 链接:https://pan.baidu.com/s/17W7gpJNbqgBFy7VOl6-dvw 提取码:2a7t 2.安装就不说了,基本全默认就OK.安装完城 ...
- [整理]EF6.X更新了什么(版本历史中文版)
下定决心以后用EF6.x版本了.想看看有什么更新特性,结果去人家github老巢一看,EF7 for vnext,顿时蛋疼了起来.想想国内这种技术氛围,有多少还在用ASP的,有多少还在用ADO.NET ...
- 中小型研发团队架构实践八:分布式协调服务ZooKeeper
一.ZooKeeper 是什么 Apache ZooKeeper 由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目. ZooKeeper ...
- 理解RESTFul和SOA
RESTFul:面向资源的架构(roa) RESTFul基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格, rest是Representational State Transfer ...
- Qt程序Release版出现 类似 QEventLoop: Cannot be used without QApplication 问题的终极解决方案
最近在做Qt程序开发,程序在Debug下跑是没有问题的,发布到Release版本后,出现各种问题: 报各种莫名其妙的错误,类似的错误有: QEventLoop:Cannot be used wit ...
- Implementation:Bellman-ford
单源最短路径算法Bellman-ford练习,可以处理有负边的情况(也可以在存在负圈时及时终止) #include <iostream> #include <cstdlib> ...
- 用hmac验证客户端的合法性
服务器端程序 import os import hmac import socket def auth(conn): secret_key = b'rock' rand_b = os.urandom( ...