线程池简单例子及分析

 

关于概念什么的我也是看别人的blog:

http://blog.csdn.net/xiaoxiaohacker/article/details/17525799

http://blog.csdn.net/jeffhtlee/article/details/7851120

http://blog.csdn.net/XSL1990/article/details/18564097

 

贴上自己的demo:

 

线程池:

 

package com.yea.test.thread;

import org.apache.log4j.Logger;

import java.util.concurrent.*;

/**
 * User: Circo
 * Date: 1/16/14
 * Time: 9:10 PM
 */
public class TestThreadPool {
    public  final Logger logger = Logger.getLogger(TestThreadPool.class);

    /**
     * 线程池之外的缓冲队列
     */
    private  LinkedBlockingQueue<Runnable> taskList = new LinkedBlockingQueue<Runnable>();

    /**
     * 线程池的策略(当池中和缓冲队列中的任务满了时的动作--加入池外的缓冲队列)
     * 对于加入池外队列的任务,线程池不会自动加载运行,需要[定时器]的帮助
     */
    private  RejectedExecutionHandler handler = new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            try {
                logger.debug("taskList add " + r.toString());
                taskList.put(r);
                logger.debug("taskList size=" + taskList.size());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    /**
     * 线程池 执行线程最少为 3,最多为 4,存活时间为 3,单位 秒,缓冲队列为2,策略为自定义
     */
    private  ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 4, 3,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<Runnable>(2),
            handler
    );

    /**
     * 定时器 定时执行某个任务
     * 这里执行任务:scheduledThread
     */
    private  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

    /**
     * 定时器的任务
     * 任务为:定时把线程池外的任务拿给线程池去执行
     */
    private  Runnable scheduledThread = new Runnable() {
        @Override
        public void run() {
            Runnable runnable = taskList.poll();
            logger.debug("remove task " + runnable.toString() + "from taskList");
            threadPoolExecutor.execute(runnable);
        }
    };

    private void execute() {

        //产生15个线程,加入线程池
        for (int i = 0; i < 10; i++) {
            try {
                String task = "task@" + i;
                logger.debug("add  " + task + " to ThreadPool");
                threadPoolExecutor.execute(new Task(task));
                //休息0.2秒 便于观察
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //执行定时器任务
        //表示:1秒之后运行,每隔2秒执行一次scheduledThread任务
        scheduledExecutorService.scheduleAtFixedRate(scheduledThread, 1, 3, TimeUnit.SECONDS);
    }

    public static void main(String[] args) {
        //开始执行
        new TestThreadPool().execute();
    }
}

 任务:

 

package com.yea.test.thread;

import org.apache.log4j.Logger;

/**
 * User: Circo
 * Date: 1/16/14
 * Time: 9:42 PM
 */
public class Task extends Thread{

    private static final Logger logger = Logger.getLogger(Task.class);

    public Task(String name) {
        this.setName(name);
    }

    public void run() {

        try {
            logger.debug("线程-- " + this.getName() + " --开始~");
            //随机数0-19  如果等于5就退出循环 结束线程
            while (5 != (int) (Math.random() * 20)) {
                //睡眠三秒==处理任务
                Thread.sleep(2000);
            }
            logger.debug("线程-- " + this.getName() + " --结束。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

 

运行结果分析:



 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值