- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java线程池的几种实现方法和区别介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Java线程池的几种实现方法和区别介绍 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestThreadPool {
// -newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
// -其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子
// -和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP
// IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器
// -从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同:
// fixed池线程数固定,并且是0秒IDLE(无IDLE)
// cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE
private static ExecutorService fixedService = Executors.newFixedThreadPool(6);
// -缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中
// -缓存型池子通常用于执行一些生存期很短的异步型任务
// 因此在一些面向连接的daemon型SERVER中用得不多。
// -能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
// 注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。
private static ExecutorService cacheService = Executors.newCachedThreadPool();
// -单例线程,任意时间池中只能有一个线程
// -用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)
private static ExecutorService singleService = Executors.newSingleThreadExecutor();
// -调度型线程池
// -这个池子里的线程可以按schedule依次delay执行,或周期执行
private static ExecutorService scheduledService = Executors.newScheduledThreadPool(10);
public static void main(String[] args) {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<
Integer
> customerList = new ArrayList<
Integer
>();
System.out.println(format.format(new Date()));
testFixedThreadPool(fixedService, customerList);
System.out.println("--------------------------");
testFixedThreadPool(fixedService, customerList);
fixedService.shutdown();
System.out.println(fixedService.isShutdown());
System.out.println("----------------------------------------------------");
testCacheThreadPool(cacheService, customerList);
System.out.println("----------------------------------------------------");
testCacheThreadPool(cacheService, customerList);
cacheService.shutdownNow();
System.out.println("----------------------------------------------------");
testSingleServiceThreadPool(singleService, customerList);
testSingleServiceThreadPool(singleService, customerList);
singleService.shutdown();
System.out.println("----------------------------------------------------");
testScheduledServiceThreadPool(scheduledService, customerList);
testScheduledServiceThreadPool(scheduledService, customerList);
scheduledService.shutdown();
}
public static void testScheduledServiceThreadPool(ExecutorService service, List<
Integer
> customerList) {
List<
Callable
<Integer>> listCallable = new ArrayList<
Callable
<Integer>>();
for (int i = 0; i <
10
; i++) {
Callable<Integer> callable = new Callable<
Integer
>() {
@Override
public Integer call() throws Exception {
return new Random().nextInt(10);
}
};
listCallable.add(callable);
}
try {
List<
Future
<Integer>> listFuture = service.invokeAll(listCallable);
for (Future<
Integer
> future : listFuture) {
Integer id = future.get();
customerList.add(id);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(customerList.toString());
}
public static void testSingleServiceThreadPool(ExecutorService service, List<
Integer
> customerList) {
List<
Callable
<List<Integer>>> listCallable = new ArrayList<
Callable
<List<Integer>>>();
for (int i = 0; i <
10
; i++) {
Callable<List<Integer>> callable = new Callable<
List
<Integer>>() {
@Override
public List<
Integer
> call() throws Exception {
List<
Integer
> list = getList(new Random().nextInt(10));
boolean isStop = false;
while (list.size() > 0 && !isStop) {
System.out.println(Thread.currentThread().getId() + " -- sleep:1000");
isStop = true;
}
return list;
}
};
listCallable.add(callable);
}
try {
List<
Future
<List<Integer>>> listFuture = service.invokeAll(listCallable);
for (Future<
List
<Integer>> future : listFuture) {
List<
Integer
> list = future.get();
customerList.addAll(list);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(customerList.toString());
}
public static void testCacheThreadPool(ExecutorService service, List<
Integer
> customerList) {
List<
Callable
<List<Integer>>> listCallable = new ArrayList<
Callable
<List<Integer>>>();
for (int i = 0; i <
10
; i++) {
Callable<List<Integer>> callable = new Callable<
List
<Integer>>() {
@Override
public List<
Integer
> call() throws Exception {
List<
Integer
> list = getList(new Random().nextInt(10));
boolean isStop = false;
while (list.size() > 0 && !isStop) {
System.out.println(Thread.currentThread().getId() + " -- sleep:1000");
isStop = true;
}
return list;
}
};
listCallable.add(callable);
}
try {
List<
Future
<List<Integer>>> listFuture = service.invokeAll(listCallable);
for (Future<
List
<Integer>> future : listFuture) {
List<
Integer
> list = future.get();
customerList.addAll(list);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(customerList.toString());
}
public static void testFixedThreadPool(ExecutorService service, List<
Integer
> customerList) {
List<
Callable
<List<Integer>>> listCallable = new ArrayList<
Callable
<List<Integer>>>();
for (int i = 0; i <
10
; i++) {
Callable<List<Integer>> callable = new Callable<
List
<Integer>>() {
@Override
public List<
Integer
> call() throws Exception {
List<
Integer
> list = getList(new Random().nextInt(10));
boolean isStop = false;
while (list.size() > 0 && !isStop) {
System.out.println(Thread.currentThread().getId() + " -- sleep:1000");
isStop = true;
}
return list;
}
};
listCallable.add(callable);
}
try {
List<
Future
<List<Integer>>> listFuture = service.invokeAll(listCallable);
for (Future<
List
<Integer>> future : listFuture) {
List<
Integer
> list = future.get();
customerList.addAll(list);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(customerList.toString());
}
public static List<
Integer
> getList(int x) {
List<
Integer
> list = new ArrayList<
Integer
>();
list.add(x);
list.add(x * x);
return list;
}
}
|
使用:LinkedBlockingQueue实现线程池讲解 。
1
2
3
4
5
6
7
8
9
10
11
|
//例如:corePoolSize=3,maximumPoolSize=6,LinkedBlockingQueue(10)
//RejectedExecutionHandler默认处理方式是:ThreadPoolExecutor.AbortPolicy
//ThreadPoolExecutor executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 1L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10));
//1.如果线程池中(也就是调用executorService.execute)运行的线程未达到LinkedBlockingQueue.init(10)的话,当前执行的线程数是:corePoolSize(3)
//2.如果超过了LinkedBlockingQueue.init(10)并且超过的数>=init(10)+corePoolSize(3)的话,并且小于init(10)+maximumPoolSize. 当前启动的线程数是:(当前线程数-init(10))
//3.如果调用的线程数超过了init(10)+maximumPoolSize 则根据RejectedExecutionHandler的规则处理。
|
关于:RejectedExecutionHandler几种默认实现讲解 。
1
2
3
4
5
6
7
8
|
//默认使用:ThreadPoolExecutor.AbortPolicy,处理程序遭到拒绝将抛出运行时RejectedExecutionException。
RejectedExecutionHandler policy=
new
ThreadPoolExecutor.AbortPolicy();
// //在 ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的execute本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
// policy=new ThreadPoolExecutor.CallerRunsPolicy();
// //在 ThreadPoolExecutor.DiscardPolicy 中,不能执行的任务将被删除。
// policy=new ThreadPoolExecutor.DiscardPolicy();
// //在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
// policy=new ThreadPoolExecutor.DiscardOldestPolicy();
|
以上这篇Java线程池的几种实现方法和区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于Java线程池的几种实现方法和区别介绍的文章就讲到这里了,如果你想了解更多关于Java线程池的几种实现方法和区别介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
晚上在 QQ 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题: 在VBS中有办法定义字节数组么? 在VBS中有办法定义字节数组么?就是字节子类型数组(VarType是8209的那种)注意不是V
例如,员工管理应用程序可能包括一个EmPloyee 类。然后可以用这个类来创建和维护特定实例,比如Gonn和Sally。 根据预定义的类创建对象常称为类的实例化(class insta
在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是一个模板,它指示它的
DBA_2PC_PENDING Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短的时间内完成,根本无法察觉到。但是,如果在commit或
目录 计算过程 投影分量计算 假设你有一家理发店,已经记录了过去一年中所有顾客的头发长度和发型偏好的数据。现在你想从这些数据中提取一些主要的信息,比如顾客最常
Object.defineProperty函数会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回此对象。 一、简单使用 const obj = {} Object.defineP
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
一 点睛 Thrift 是一歀基于 CS 架构的 RPC 框架,最初由 Facebook 研发,2008 年转入 Apache 组织。开发人员可以使用 Thrift 提供的 IDL(接口定义语言)来定
数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问,管理,搜索和复制其包含的数据。 数据库还使用非关系数据源,例如对象或文件。 然而,数据库证明是大数
介绍 Ant是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具。在我们详细了解 Apache Ant 之前, 让我们来讲解为什么构建工具是需要最先了解的。 构建工具的需求
我现在正在尝试学习ocaml,并希望从一个小程序开始,生成所有位组合: [“0”,“0”,“0”] [“0”,“0”,“1”] [“0”,“1”,“0”] ... 等等 我的想法是下面的代码: let
我正在做我的介绍 C 类(class)作业,我的任务是执行以下任务...... 为一个函数编写代码,该函数通过值接收两个参数(a 和 b)并通过引用具有另外两个参数(c 和 d)。所有参数都是双倍的。
我希望提供有关我网站内容的快速演示,以及如何在用户访问我的页面后立即以正确的方式使用它们。我希望使用顶部的弹出式窗口进行演示。 我的意思是小信息框,一个接一个地通知用户各个步骤。任何人都可以帮助我如何
与C、Java等语言一样,JavaScript中可以用&&、||、!三个逻辑判断符来对boolean值进行逻辑判断。与C、Java不同的是,JavaScript中逻辑与(&&
JavaScript中,==与===操作符均可用于判断两个值是否相等;不同之处在于,如果进行判断的两个值类型不一致,===操作符会直接返回false,而==操作符则会在类型转换后再进行判断。详细的判
JavaScript中,object转换为boolean的操作非常简单:所有的object转换成boolean后均为true;即使是new Boolean(false)这样的object在转换为bo
在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测。尤其是当前Activity需要往前一个Activity传送消息时。即Activity1跳转到Activity3如果采用的是
背景 当要求系统启动一个应用程序时,系统会先查找当前命令是否是内部命令,若不是,则在当前目录下查找,如果仍没有找到,则在系统变量 Path 指定的路径去查找。JDK(Java Developmen
概述 想做一个微信的公众平台,阅读了微信官方给的网址接入的示例代码,发现有个问题好像一直都是半知半解的,就是在类里边直接使用$_GET。仔细查了下关于这方面的知识,发现PHP中这部分的基础知识掌握
我是一名优秀的程序员,十分优秀!