`
yea_love
  • 浏览: 4079 次
社区版块
存档分类
最新评论

线程池简单例子及分析

阅读更多

 

关于概念什么的我也是看别人的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();
        }
    }

}

 

运行结果分析:



 

 

 

 

 

  • 大小: 197.2 KB
  • 大小: 136.2 KB
  • 大小: 236.7 KB
2
4
分享到:
评论
4 楼 yea_love 2014-01-23  
hzxlb910 写道
引用
设置log4j.xml的日志级别为DEBUG,然后在运行

是的,可以了,谢谢
代码还是可以的,你写详细点,就不会被这么多人踩了哈哈。
我帮你ding一下。

下次还是用打印输出,最近在研究log4j所以没注意,不好意思...
3 楼 hzxlb910 2014-01-23  
引用
设置log4j.xml的日志级别为DEBUG,然后在运行

是的,可以了,谢谢
代码还是可以的,你写详细点,就不会被这么多人踩了哈哈。
我帮你ding一下。
2 楼 hdwmp123 2014-01-23  
hzxlb910 写道
我运行了,没有结果啊

设置log4j.xml的日志级别为DEBUG,然后在运行
 <root>
        <level
            value="DEBUG" />
        <appender-ref
            ref="CONSOLE" />
        <appender-ref
            ref="FILE" />
      </root>
1 楼 hzxlb910 2014-01-23  
我运行了,没有结果啊

相关推荐

    java线程池概念.txt

    举个简单的例子:  假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。  因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;  当10个工人都有任务在做时,如果还来了任务,...

    kafka-example:卡夫卡的例子

    消费者对于KafkaConsumer而言,它不是线程安全的,所以实现多线程时通常由两种实现方法:每个线程维护一个KafkaConsumer维护一个或多个KafkaConsumer,并用一个任务线程池处理任务优缺点分析:方法一:实现简单(即...

    word源码java-project:个人用代码库,主要是SpringBoot、SpringCloud、Apache等代码,也包含常见业务代码

    (企业增值税数据分析系统, 放弃维护) Demo 级别 (sonar例子) (Spring线程池异步任务) (注解缓存框架) (阿里数据源Druid整合) (Dubbo的简单使用) (常用的文件下载实例, word、excel、pdf) (简单的国际化实现) ...

    Java优化编程(第2版)

    1.8.1 简单语句 1.8.2 复合语句 1.9 空格与空行的应用规则 1.9.1 空格的应用规则 1.9.2 空行的应用规则 1.10 方法、变量与常量的命名规则 1.10.1 方法的命名规则 . 1.10.2 变量的命名规则 1.10.3 常量的命名规则 ...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    javaSE代码实例

    3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的优先级关系 38 3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2...

    ofbiz综合技术文档

    2、应用分析与总体设计(用例,对象分析) 67 3、整体设计完成后进行详细设计 67 4、应用集成 68 二、开发规范 68 1、命名原则 68 2、界面显示 68 3、接口 68 第十部分、Ofbiz基础应用说明 69 一、介绍 69 二、主要...

    vc++ 应用源码包_1

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_2

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_6

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_5

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_3

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 开发实例源码包

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    Java范例开发大全 (源程序)

     实例32 优良及差 47  实例33 打印任意一年日历 48  实例34 一年四季的划分 51  第2篇 Java数据处理  第4章 异常处理(教学视频:62分钟) 54  4.1 编译时异常 54  实例35 除0发生的算术异常...

    java范例开发大全(pdf&源码)

    实例255 一个关于泛型的简单例子 511 实例256 带两个类型参数的泛型 513 实例257 有界类型程序示例 514 实例258 通配符使用示例 515 实例259 泛型方法使用示例 516 实例260 泛型接口示例 518 实例261 泛型实现坐标...

    java范例开发大全源代码

     实例32 优良及差 47  实例33 打印任意一年日历 48  实例34 一年四季的划分 51  第2篇 Java数据处理  第4章 异常处理(教学视频:62分钟) 54  4.1 编译时异常 54  实例35 除0发生的算术异常...

    java范例开发大全

    实例255 一个关于泛型的简单例子 511 实例256 带两个类型参数的泛型 513 实例257 有界类型程序示例 514 实例258 通配符使用示例 515 实例259 泛型方法使用示例 516 实例260 泛型接口示例 518 实例261 泛型实现坐标...

    疯狂JAVA讲义

    1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...

Global site tag (gtag.js) - Google Analytics