当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

java ThreadPool 线程池

发表于: 2012-05-13   作者:blackproof   来源:转载   浏览次数:
摘要: 线程池的参数corePoolSize 为核心线程;maximunPoolSize为最大线程; keepAliveTime为最长生命时间;unit是其时间单位;workQueue任务队列; handler是过多线程之后的策略   对于线程池的处理线程机制,网上有一堆,但是机制核心是优先处理核心线程,优先堆满线程池,初学者建议不用轻易使用拒绝策略,除非是可容忍的线程  

线程池的参数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());  
    }  
} 
 

 

java ThreadPool 线程池

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1 什么是线程池? 2 class CJobImpl { public: virtual void DoJob()=0; }; class CJob : public CJ
http://www.2ccc.com/btdown.asp?articleid=5953 ftp://download:S3cirpYW3DoR@www.2ccc.com/vcl/sy
线程池ThreadPool的常用方法介绍 如果您理解了线程池目的及优点后,让我们温故下线程池的常用的几个
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行
1. 引言 合理利用线程池能够带来好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建
1. 引言 合理利用线程池能够带来好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建
1. 引言 合理利用线程池能够带来好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建
1. 引言 合理利用线程池能够带来好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建
Java 线程池学习 Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程
首页 资讯 精华 论坛 问答 博客 群组 更多 ▼ 欢迎endual 3 收件箱(3) 我的应用 我的博客 设置 退出
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号