java线程池小例子
来源:互联网 发布:js怎么获取a标签的值 编辑:程序博客网 时间:2024/05/04 09:45
最近一直在研究线程池的使用方法,具体线程池工作原理可以参照 前几天写的模拟线程池的例子 java线程池实现方式 java已经有实现好的线程池,并且有完善的管理机制,下面将最近学习体会分享一下。
首先创建一个监控线程来监控线程池的具体资源情况
/**
* 监控线程
* @author lizh
* @date 2014-1-26下午3:57:57
* @fileName MonitorThread.java
* @package threadPoolJava
* @project Test
*/
public class MonitorThread implements Runnable{
private int delay;//线程监控周期
private ThreadPoolExecutor executor;//线程池
private boolean isRun = true;//监控线程是否运行
public MonitorThread(int delay, ThreadPoolExecutor executor) {
this.delay = delay;
this.executor = executor;
}
public void shutDown(){
this.isRun = false;
}
@Override
public void run() {
while(isRun){
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.getTaskCount(),
this.executor.getCompletedTaskCount(),
this.executor.isShutdown(),
this.executor.isTerminated()));
try {
Thread.sleep(delay*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建 当任务被拒绝后的处理
/**
* 处理被线程池拒绝的任务
* @author lizh
* @date 2014-1-26下午3:57:33
* @fileName RejectedExecutionHandlerImpl.java
* @package threadPoolJava
* @project Test
*/
public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler{
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println(r.toString()+"is rejected");
while(executor.getQueue().size()>=5){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
executor.execute(r);
// 此处可以使用主线程直接将被拒绝的work执行,也可以由上述代码 等线程的任务队列小于最大值时 重新添加到线程池
// Thread t = new Thread(r);
// t.start();
}
}
下面创建任务线程测试类
/**
* 工作线程
* @author lizh
* @date 2014-1-26下午4:01:57
* @fileName WorkThread.java
* @package threadPoolJava
* @project Test
*/
public class WorkThread implements Runnable{
private String command;
public WorkThread(String command) {
this.command = command;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"strat");
processCommand();
System.out.println(Thread.currentThread().getName()+"end");
}
public void processCommand(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "WorkThread [command=" + command + "]";
}
}
最后创建模拟线程池实用类
/**
* 测试线程池类
* @author lizh
* @date 2014-1-26下午4:01:29
* @fileName WorkPool.java
* @package threadPoolJava
* @project Test
*/
public class WorkPool {
public static void main(String[] args) {
RejectedExecutionHandler rejeHandler = new RejectedExecutionHandlerImpl();
ThreadFactory threadFaction = Executors.defaultThreadFactory();
ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 10,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5),
threadFaction, rejeHandler);
MonitorThread monitor = new MonitorThread(3, pool);
Thread thread = new Thread(monitor);
thread.start();
for (int i = 0; i < 20; i++) {
WorkThread th = new WorkThread("cmd" + i);
pool.execute(th);
}
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
pool.execute(new WorkThread("123"));
pool.shutdown();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
monitor.shutDown();
}
}
很简单的小例子运行起来 结果如下
相信看完大家都会明白 尽管任务队列最大为5 允许最大线程数为4 但是21个任务都成功执行 很神奇 一起分享
- java线程池小例子
- java线程小例子
- java线程小例子
- java 线程池应用小例子
- JAVA线程池源码探究与简单小例子
- java生产消费线程小例子
- java 线程死锁的小例子
- java线程的一个小例子
- java线程同步的小例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- JAVA线程池例子
- Java线程池例子
- (安装cuteftp)Ubuntu安装FTP服务…
- get_user() ,put_user(),copy_to_u…
- 环形缓冲区
- Linux内核中的likely()与unlikely(…
- arm-vfp-linux-gnu交叉编译工具安…
- java线程池小例子
- 分解链表
- 什么情况下使用多线程
- tiny6410 linux开发平台的搭建
- 一直报数游戏
- 使用busybox构建linux根文件系统
- secureCRT The remote system refu…
- 转载:LINUX字符设备驱动程序实例-…
- linux 安装ARM-LINUX-GCC