java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

并发主题

使用Executors 和 ThreadPoolExecutor实现Java线程池案例

首先需要一个工作线程:

package com.journaldev.threadpool;

public class WorkerThread implements Runnable {

private String command;

public WorkerThread(String s){

this.command=s;

}

@Override

public void run() {

System.out.println(Thread.currentThread().getName()+' Start. Command = '+command);

processCommand();

System.out.println(Thread.currentThread().getName()+' End.');

}

private void processCommand() {

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

public String toString(){

return this.command;

}

}

下面是线程池的测试案例:

package com.journaldev.threadpool;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class SimpleThreadPool {

public static void main(String[] args) {

ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {

Runnable worker = new WorkerThread('' + i);

executor.execute(worker);

}

executor.shutdown();

while (!executor.isTerminated()) {

}

System.out.println('Finished all threads');

}

}

输出结果:

pool-1-thread-2 Start. Command = 1

pool-1-thread-4 Start. Command = 3

pool-1-thread-1 Start. Command = 0

pool-1-thread-3 Start. Command = 2

pool-1-thread-5 Start. Command = 4

pool-1-thread-4 End.

pool-1-thread-5 End.

pool-1-thread-1 End.

pool-1-thread-3 End.

pool-1-thread-3 Start. Command = 8

pool-1-thread-2 End.

pool-1-thread-2 Start. Command = 9

pool-1-thread-1 Start. Command = 7

pool-1-thread-5 Start. Command = 6

pool-1-thread-4 Start. Command = 5

pool-1-thread-2 End.

pool-1-thread-4 End.

pool-1-thread-3 End.

pool-1-thread-5 End.

pool-1-thread-1 End.

Finished all threads

线程池需要规定起初线程数目,使用RejectedExecutionHandler 实现:

package com.journaldev.threadpool;

import java.util.concurrent.RejectedExecutionHandler;

import java.util.concurrent.ThreadPoolExecutor;

public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {

@Override

public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

System.out.println(r.toString() + ' is rejected');

}

}

通过监视线程池中结果:

package com.journaldev.threadpool;

import java.util.concurrent.ThreadPoolExecutor;

public class MyMonitorThread implements Runnable

{

private ThreadPoolExecutor executor;

private int seconds;

private boolean run=true;

public MyMonitorThread(ThreadPoolExecutor executor, int delay)

{

this.executor = executor;

this.seconds=delay;

}

public void shutdown(){

this.run=false;

}

@Override

public void run()

{

while(run){

System.out.println(

String.format('[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s',

this.executor.getPoolSize(),

this.executor.getCorePoolSize(),

this.executor.getActiveCount(),

this.executor.getCompletedTaskCount(),

this.executor.getTaskCount(),

this.executor.isShutdown(),

this.executor.isTerminated()));

try {

Thread.sleep(seconds*1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

下面是启动线程池实现:

package com.journaldev.threadpool;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.Executors;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public class WorkerPool {

public static void main(String args[]) throws InterruptedException{

//RejectedExecutionHandler implementation

RejectedExecutionHandlerImpl rejectionHandler = new RejectedExecutionHandlerImpl();

//Get the ThreadFactory implementation to use

ThreadFactory threadFactory = Executors.defaultThreadFactory();

//creating the ThreadPoolExecutor

ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue(2), threadFactory, rejectionHandler);

//start the monitoring thread

MyMonitorThread monitor = new MyMonitorThread(executorPool, 3);

Thread monitorThread = new Thread(monitor);

monitorThread.start();

//submit work to the thread pool

for(int i=0; i<10; i++){

executorPool.execute(new WorkerThread('cmd'+i));

}

Thread.sleep(30000);

//shut down the pool

executorPool.shutdown();

//shut down the monitor thread

Thread.sleep(5000);

monitor.shutdown();

}

}

在初始化的ThreadPoolExecutor,我们保持初始池大小为2,最大池大小为4,工作队列大小为2。因此,如果有4个正在运行的任务,并提交了更多的任务,工作队列将持有其中2个和其余休息将他们交由RejectedExecutionHandlerImpl处理。

输出结果:

pool-1-thread-1 Start. Command = cmd0

pool-1-thread-4 Start. Command = cmd5

cmd6 is rejected

pool-1-thread-3 Start. Command = cmd4

pool-1-thread-2 Start. Command = cmd1

cmd7 is rejected

cmd8 is rejected

cmd9 is rejected

[monitor] [0/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false

[monitor] [4/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false

pool-1-thread-4 End.

pool-1-thread-1 End.

pool-1-thread-2 End.

pool-1-thread-3 End.

pool-1-thread-1 Start. Command = cmd3

pool-1-thread-4 Start. Command = cmd2

[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false

[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false

pool-1-thread-1 End.

pool-1-thread-4 End.

[monitor] [4/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true

[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

getordefault java_Java map.getOrDefault()方法的用法详解

Map.getOrDefault(Object key, V defaultValue)方法的作用是&#xff1a;当Map集合中有这个key时&#xff0c;就使用这个key值&#xff1b;如果没有就使用默认值defaultValue。代码示例如下&#xff1a;HashMap map new HashMap<>();map.put("name", "co…

java 复合_【福利】java新手做的复合型计算器!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先前用那个代码不走样说要审核,我这里不用那个来发代码import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JTextField;import java.awt.GridLayout;import javax.sw…

python模块如何导入解释器_无法从嵌入式解释器导入内置模块(仅限Windows)

这个问题看起来可能是一个重复的问题但我认为我的问题是不同的。我正在从一个MSVC编译的C应用程序运行Python 3.4解释器&#xff0c;并且我尝试使用PTVSD模块来调试更容易。到目前为止&#xff0c;我已经能够连接到Python Ipter&#xff0c;我从命令行开始&#xff0c;没有问题…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题&#xff1f;在初学者阶段&#xff0c;许多童鞋都对方法传参比较迷茫&#xff0c;知其然不知其所以然。一.先说说参数传递的几个术语&#xff1a;值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java web spark_spark-微型的Java Web框架 Spark Framework

导读热词Spark是一个微型的Java Web框架&#xff0c;它的灵感来自于Sinatra&#xff0c;它的目的是让你以最小的代价创建出一个Java Web应用。Implement CORS in Spark -spark中如何处理跨域资源共享问题代码如下&#xff1a;// Enables CORS on requests. This method is an i…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛&#xff0c;所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议&#xff0c;在网络中它与TCP协议一样用于处理数据包&#xff0c;是一种无连接的协议。在OSI模型中&#xff0c;在第…

java 8 foreach_Java 8 forEach Stream()与旧版forEach循环

我正在尝试使用Spring的示例代码.部分代码如下所示&#xff1b;private List points;long timeTakeninMilis System.currentTimeMillis();public List getPoints() {return points;}public void setPoints(List points) {this.points points;}public void drawJava8() {point…

java list 超出范围_java-列索引超出范围:2,列数1

我有这个表&#xff1a;学生CREATE TABLE IF NOT EXISTS Klas_student(Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL);在此表格中,我想添加值,我使用prepa…

java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园

最近因为项目的国际化的需要&#xff0c;需要对整个项目的100来个插件做国际化&#xff0c;这是一件痛苦的事情&#xff0c;因为纯体力劳动。为了省点工作量&#xff0c;想着能不能写个程序批处理了&#xff0c;减少点工作量&#xff0c;于是就有了下面的代码。1.读取指定的(.j…

点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

最近在开发浏览器碰到这么一个需求&#xff1a;点击地址栏的时候&#xff0c;需要全选并调出键盘&#xff0c;再次点击就取消全选显示光标。点击屏幕除地址栏其他位置时&#xff0c;键盘隐藏&#xff0c;隐藏光标。大部分浏览器都是这样的逻辑&#xff0c;这样可以提高用户体验…

java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

RSA的应用RSA是一种非对称加密算法。现在&#xff0c;很多登陆表单的密码的都采用RSA加密&#xff0c;例如京东中的登陆使用公钥对密码进行加密java使用RSA加密方式实现数据加密解密&#xff0c;需要首先产生私钥和公钥测试代码public static void main(String args[]){try {RS…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外&#xff0c;还有没有别的方式跟踪线上服务问题呢&#xff1f;或者&#xff0c;跟踪并排除日志里无法发现的问题&#xff1f;方法当然是有的&#xff0c;就是通过现场快照定位并发现问题。我们所说的现场&#xff0c;主要指这两方面&#xff1a;Java 线程栈。线程栈是J…

java实验二答案天津商业大学_天津商业大学信息安全实验一

天津商业大学信息安全实验一 1《信息安全技术》实 验 报 告 书实验名称&#xff1a; 实验一Internet应用风险专 业&#xff1a; 电子商务班 级&#xff1a; 1203班姓 名&#xff1a; 代常发学 号&#xff1a; 20124934指导老师&#xff1a; 丁雷信息工程学院2015 年 5 月2目 录…

java前端的日期插件_几个前端时间插件总结

几个前端时间插件总结总结一下几款时间插件&#xff0c;分别是- [ ] jeDate 手册http://www.jemui.com/jedate/- [ ] bootstrap-datetimepicker 下载地址- [ ] My97DatePicker 下载地址- [ ] jQuery UI 插件Datepicker下载地址并没有哪款完全超越另外一款&#xff0c;主要还是看…

t3s java_关于JAVA的this关键字

网上对this的描述很朦胧&#xff0c;有的说this表示的是当前对象自己&#xff0c;有的说this是当前对象的引用。可是自己写了如下的测试代码&#xff0c;产生了几个问题&#xff1a;1 public class T3AboutThis {23 public static void main(String[] args) {4 new…

Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

有时上网时会遇到浏览器不能正常显示的问题。(比如我的火狐浏览器无法正确显示微信公众号管理后台&#xff0c;在chrome上可以正常显示)&#xff0c;所以我的电脑里安装了chrome和firefox两个浏览器。但是时间长了&#xff0c;会出现两个浏览器上书签不同步的问题。原来自己的解…

java连接并操作redis_java 使用 jedis 连接 redis 并进行简单操作

packagetest;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.junit.Test;importredis.RedisUtil;importredis.clients.jedis.Jedis;public classRedisTest {private RedisUtil redisUtil newRedisUtil();//字符串操作…

java将异常输出到日志_【ThinkingInJava】25、将异常输出记录到日志

/*** 书本:《Thinking In Java》* 功能:将异常输出记录到日志中。* 文件:LoggingExceptions.java* 时间:2015年4月8日21:11:51* 作者:cutter_point*/package Lesson12_error_handling_with_exceptions;import java.io.PrintWriter;import java.io.StringWriter;import java.uti…

2013年蓝桥杯软件大赛预赛java本科b组答案_2013年蓝桥杯软件大赛预赛C本科B组试题...

第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛结果题目标题: 高斯日记大数学家高斯有个好习惯&#xff1a;无论如何都要记日记。他的日记有个与众不同的地方&#xff0c;他从不注明年月日&#xff0c;而是用一个整数代替&#xff0c;比如&#xff1a;4210后来人们知道…

java script的trim_Javascript中实现trim()函数的两种方法

在JavaScript中我们需要用到trim的地方很多&#xff0c;但是JavaScript又没有独立的trim函数或者方法可以使用&#xff0c;所以我们需要自己写个trim函数来实现我们的目的。方案一&#xff1a;以原型方式调用&#xff0c;即obj.trim()形式&#xff0c;此方式简单且使用方面广泛…