Java多线程与并发库高级应用-线程池
线程池
线程池的思想
线程池的概念与Executors类的应用
> 创建固定大小的线程池
> 创建缓存线程池
> 创建单一线程池(如何实现线程死掉后重新启动?)
关闭线程池
> shutdown 与 shutdownNow的比较
用线程池启动定时器
> 调用ScheduleExecutorService 的 schedule 方法,返回的ScheduleFuture对象可以取消任务。
> 支持间隔重复任务的定时方式,不直接支持决定定时的方法,需要转换成相对时间方式。
public class ThreadPoolTest { public static void main(String[] args) {
// ExecutorService threadPool = Executors.newFixedThreadPool(3); //创建一个固定大小的线程池,线程池中有3个线程可以同时服务
//缓存线程池 线程池中的线程数是动态变化的,当所有线程处于服务状态时,还有需要被服务的任务,自动增加一个线程进行服务
//当任务执行完毕,线程处于空闲一段时间,超时后则自动回收销毁线程
// ExecutorService threadPool = Executors.newCachedThreadPool();
//创建一个只有一个线程的线程池,当这个线程挂掉时,可以自动生成一个线程来代替
//可以解决一个网上很多人问的问题(如何实现线程死掉后重新启动?)
ExecutorService threadPool = Executors.newSingleThreadExecutor();
for(int i = 0;i<10;i++){ //往线程池中扔10个任务
final int task = i;
threadPool.execute(new Runnable() { //往线程池中扔了一个任务 @Override
public void run() {
for(int j = 0;j<10;j++){
System.out.println(Thread.currentThread().getName()+" is loop of "+ j + "the task of "+task);
}
}
});
}
System.out.println("all of 10 tasks have committed");
//上述代码执行完后 没有结束,线程池中有3个线程一直存在,所以程序不会结束
//可以使用 threadPool.shutdown()
threadPool.shutdown(); //当线程池中线程执行完所有任务,所有线程处于空闲状态时,干掉所有线程,程序自结束
// threadPool.shutdownNow(); //立即把池子中所有线程干掉,无论任务是否干完 }
}
package com.java.juc; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外的开销,提高了响应的速度。
*
* 二、线程池的体系结构:
* java.util.concurrent.Executor: 负责线程的使用与调度根接口。
* |--**ExecutorService 子接口:线程池的主要接口
* |--ThreadPoolExecutor 线程池的实现类
* |--ScheduledExecutorService 子接口:负责线程的调度
* |--ScheduledThreadPoolExecutor : 继承 ThreadPoolExecutor 实现ScheduledExecutorService
* 三、工具类:Executors
* ExecutorService newFixedThreadPool() :创建固定大小的线程池。
* ExecutorService newCachedThreadPool(): 创建无限大小的线程池,线程池中线程数量不固定,可根据需求自动更改。
* ExecutorService newSingleThreadPool() : 创建单个线程池,线程池中只有一个线程。
*
* ScheduledExecutorService newScheduledThreadPool() 创建固定大小的线程池,可以延迟或定时的执行任务。
*
*/
public class TestThreadPool {
public static void main(String[] args) {
//1.创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
ThreadPoolDemo demo = new ThreadPoolDemo(); //2.为线程池中的线程分配任务
for(int i = 0;i<10;i++){
threadPool.submit(demo);
} //3.关闭线程池
threadPool.shutdown(); //等待现有线程池中的任务之心完毕,关闭线程池,在等待过程中不接收新的任务 }
} class ThreadPoolDemo implements Runnable{
private int i = 0;
@Override
public void run() {
while(i <= 100){
System.out.println(Thread.currentThread().getName() + " : " + i++);
}
}
}
可以在线程池中放一个Callable任务,并且可以过去到返回结果
package com.java.juc; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /**
* 一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外的开销,提高了响应的速度。
*
* 二、线程池的体系结构:
* java.util.concurrent.Executor: 负责线程的使用与调度根接口。
* |--**ExecutorService 子接口:线程池的主要接口
* |--ThreadPoolExecutor 线程池的实现类
* |--ScheduledExecutorService 子接口:负责线程的调度
* |--ScheduledThreadPoolExecutor : 继承 ThreadPoolExecutor 实现ScheduledExecutorService
* 三、工具类:Executors
* ExecutorService newFixedThreadPool() :创建固定大小的线程池。
* ExecutorService newCachedThreadPool(): 创建无限大小的线程池,线程池中线程数量不固定,可根据需求自动更改。
* ExecutorService newSingleThreadPool() : 创建单个线程池,线程池中只有一个线程。
*
* ScheduledExecutorService newScheduledThreadPool() 创建固定大小的线程池,可以延迟或定时的执行任务。
*
*/
public class TestThreadPool {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//1.创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
ThreadPoolDemo demo = new ThreadPoolDemo(); List<Future> futureList = new ArrayList<>(); for(int i = 0; i<10; i++){
Future<Integer> future = threadPool.submit(new Callable<Integer>() {
public Integer call(){
int num = 0;
for(int i = 0;i<=100;i++){
num+=i;
}
return num;
}
});
futureList.add(future);
} for(int i = 0;i<futureList.size();i++){
System.out.println(futureList.get(i).get());
} // //2.为线程池中的线程分配任务
// for(int i = 0;i<10;i++){
// threadPool.submit(demo);
// } //3.关闭线程池
threadPool.shutdown(); //等待现有线程池中的任务之心完毕,关闭线程池,在等待过程中不接收新的任务
}
} class ThreadPoolDemo implements Runnable{
private int i = 0;
@Override
public void run() {
while(i <= 100){
System.out.println(Thread.currentThread().getName() + " : " + i++);
}
}
}
5050
5050
5050
5050
5050
5050
5050
5050
5050
5050
用线程池启动定时器
Executors.newScheduledThreadPool(3).schedule(
new Runnable() {
@Override
public void run() {
System.out.println("bombing!");
}
},
10,
TimeUnit.SECONDS);
还可以在上述代码中添加固定频率
//固定频率 10秒后触发,每隔两秒后执行一次
Executors.newScheduledThreadPool(3).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
System.out.println("bombing!");
}
},
10,
2,
TimeUnit.SECONDS);
//在使用scheduleAtFixedRate 时java api没有提供在某个时间点触发,但API中提示可以通过计算,得到触发的事件点
// For example, to schedule at a certain future date,
// you can use: schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS).
Java多线程与并发库高级应用-线程池的更多相关文章
- Java多线程与并发库高级应用-java5线程并发库
java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包 ...
- Java多线程与并发库高级应用-Callable与Future的应用
Callable这种任务可以返回结果,返回的结果可以由Future去拿 >Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的. >Completion ...
- Java多线程与并发库高级应用-传统线程机制回顾
1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...
- Java多线程与并发库高级应用-传统线程同步通信技术
面试题: 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 /** * 子线程循环10次,接着主线程循环100次,接着又回到 ...
- Java多线程与并发库高级应用-传统线程互斥技术
线程安全问题: 多个线程操作同一份数据的时候,有可能会出现线程安全问题.可以用银行转账来解释. 模拟线程安全问题 /** * 启动两个线程分别打印两个名字,名字按照字符一个一个打印 * * @aut ...
- Java多线程与并发库高级应用-工具类介绍
java.util.concurrent.Lock 1.Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互 ...
- Java多线程与并发库高级应用-同步集合
ArrayBlockingQueue LinkedBlockingQueue 数组是连续的一片内存 链表是不连续的一片内存 传统方式下用Collections工具类提供的synchronizedCo ...
- Java多线程与并发库高级应用-面试题
第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日 ...
- Java多线程与并发库高级应用-可阻塞的队列
ArrayBlockQueue 可阻塞的队列 > 队列包含固定长度的队列和不固定长度的队列. > ArrayBlockQueue > 看BlockingQueue类的帮助文档,其中有 ...
随机推荐
- Python自动补全
转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...
- 针对苹果最新审核要求为应用兼容IPv6
在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...
- (原创)mybatis学习一,夯实基础
一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...
- MVC中如何设置路由指定默认页
MVC中怎么设置默认页,在webform中 只要右键设置起始页就可以,但MVC中却没有这个功能,其实MVC更简单 如下: Login是控制器,Index 是动作 在全局Global.asax中改动下即 ...
- noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05
T01 查找特定元素的值 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置. 输入 第一行包含一个正整数n,表示序列中元素个数.1 <= n <= 10000.第二 ...
- Hadoop:pig 安装及入门示例
pig是hadoop的一个子项目,用于简化MapReduce的开发工作,可以用更人性化的脚本方式分析数据. 一.安装 a) 下载 从官网http://pig.apache.org下载最新版本(目前是0 ...
- c++游戏服务器编程学习笔记(一)TCP/IP
1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...
- java并发:阻塞队列
第一节 阻塞队列 1.1 初识阻塞队列 队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列 ...
- jquery 选择器大全
jquery 选择器大体上可分为4 类: 1.基本选择器 2.层次选择器 3.过滤选择器 4.表单选择器 其中过滤选择器可以分为: 1.简单过滤选择器 2.内容过滤选择器 3.可见性过滤选择器 4.属 ...
- 硬件升级win8.1重新安装系统
上次重装系统一年后升级了硬件配置,双11后,再次折腾系统. 配置硬件的选择 部分配件已经升级过了,之前的一直是AMD平台,发热大功耗高,08年我配的AMD 8450+映泰GX790 128M待机在10 ...