线程池的参数corePoolSize 为核心线程;maximunPoolSize为最大线程;
keepAliveTime为最长生命时间;unit是其时间单位;workQueue任务队列;
handler是过多线程之后的策略
对于线程池的处理线程机制,网上有一堆,但是机制核心是优先处理核心线程,优先堆满线程池,初学者建议不用轻易使用拒绝策略,除非是可容忍的线程
package com.test.second;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class TimingThreadPool extends ThreadPoolExecutor {
public TimingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
private final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
private final AtomicLong numTasks = new AtomicLong();
private final AtomicLong totalTime = new AtomicLong();
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
System.out.println(String.format("Thread %s: start %s", t, r));
startTime.set(System.nanoTime());
}
protected void afterExecute(Runnable r, Throwable t) {
try {
long endTime = System.nanoTime();
long taskTime = endTime - startTime.get();
numTasks.incrementAndGet();
totalTime.addAndGet(taskTime);
System.out.println(String.format("Thread %s: end %s, time=%dns", t, r, taskTime));
} finally {
super.afterExecute(r, t);
}
}
protected void terminated() {
try {
System.out.println(String.format("Terminated: avg time=%dns", totalTime.get() / numTasks.get()));
} finally {
super.terminated();
}
}
private static class Task implements Runnable{
private String task;
public Task(String task){
this.task=task;
}
@Override
public void run() {
try {
System.out.println(task);
Thread.sleep(2000);
if(task.equals("51")){
throw new RuntimeException();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
TimingThreadPool pool = new TimingThreadPool(3, 4, 4, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 5; i++) {
try {
// 产生一个任务,并将其加入到线程池
String task = "" + i;
System.out.println("put " + task);
pool.execute(new Task(task));
// 便于观察,等待一段时间
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
Thread.sleep(5000);
pool.shutdown();
System.out.println(pool.getTaskCount()+" c:"+pool.getCompletedTaskCount());
}
}
分享到:
相关推荐
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
Java版线程池ThreadPool
ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行...
java线程池threadpool简单范例,使用threadgroup类
其中线程池管理器(ThreadPool Manager)的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务时进行等待;任务队列的作用是提供一种缓冲机制,将没有处理的...
线程池ThreadPool。
Java ThreadPool是一个Java框架,它使用户可以将问题分解为有限数量的子问题,以异步方式执行每个子问题,并将每个子问题的结果合并为最终问题的最终结果。 将问题划分为子问题,并将子问题的结果组合为初始问题的...
线程池 java线程池的写法 这个类展示了在java中实现ThreadPool的一种方式! 您可以轻松阅读源文件,因为注释很详细。 尽情享受吧!
ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务
先构造ThreadPool对象,然后调用其execute方法,将自己的线程作为参数传入即可(注意,不能让你的线程开启) 支持最小线程数 支持最大线程数(线程增加后不会减少) 支持线程增长阀值 支持简单日志记录
节点线程池 警告:该项目主要是实验性项目,API可能会发生变化。 该软件包使用节点10.5的新辅助线程API实现线程池(请参阅: : )... 如果您熟悉Java的线程池API,则应该非常熟悉: import { Executors } from "nod
有关java线程池的一些技术文档,很实用的。
在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来...
实例多 有自己封装的Threadpool 有java自己封装的线程池 测试例子 都有的
easy-threadpool 简单线程池实现
Java分布式应用学习笔记07线程池应用
本程序详细介绍了线程和线程池的用法,使用多线程进行和异步编程实现数据库操作和日志的记录
Maginatics线程池ThreadPool是线程池模式的C ++实现,允许将任意任务排队以由专用工作线程池执行。 它是仅标头的库,并且需要带有对Boost.Thread接口的版本4的支持。 Nathan Rosenblum)最初是ThreadPool,他是...
Socket通讯解决并发采用线程池ThreadPool.java EchoServer.java EchoClient.java
具体如下上述6个参数的配置决定了线程池的功能,具体设置时机=创建线程池类对象时传入ThreadPoolExecutor类=线程池的真正实现类开发者可根据不同需求配置核心参数,从而实现自定义线程池注:Java里已内置4种常用的...