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

线程池简单例子及分析

阅读更多

 

关于概念什么的我也是看别人的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  
我运行了,没有结果啊

相关推荐

    qt线程池的小例子

    通过分析这个小例子,我们可以学习如何在Qt应用程序中有效地使用线程池,理解多线程编程的基本概念,以及如何优化并发任务的执行。这对于开发大型、复杂的Qt应用,尤其是那些需要大量后台处理的工作,是非常有价值的...

    一个简单的线程池例子

    通过查看和分析这个源代码,我们可以学习到线程池的具体实现细节,如如何创建线程、如何管理任务队列、如何调度任务以及如何控制线程池的生命周期。这有助于我们深入理解线程池的工作原理,从而更好地在实际项目中...

    C++简单线程池例子

    这个“C++简单线程池例子”提供了实现线程池的一个实例,通过分析`TestMyThreadPool.cpp`文件,我们可以学习如何设计和使用线程池。 1. **线程池概念**:线程池是由一组预先创建的线程组成的,这些线程等待接收任务...

    java线程池概念.txt

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

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了流的概念,流是作为一种对数据执行...

    易语言完美的线程池源码

    通过分析和理解这些源代码,开发者可以深入理解线程池的工作原理,学习如何在实际项目中高效地利用线程池,提高程序的性能和响应性。同时,对于跨语言的理解,例如从易语言到C++,也可以提升编程能力。

    Linux环境下通用线程池设计

    下面展示了一个简单的通用线程池的实现例子: 1. **任务节点定义** - `taskNode` 结构体用于封装待处理的任务数据,如网络连接的句柄 `sockfd`。 2. **任务处理函数** - `printsd` 函数是一个示例性的任务处理...

    linux下c++线程池

    本资源提供的线程池实现是一个简单而实用的例子,特别适合对C++多线程编程感兴趣或需要在Linux环境中应用线程池技术的开发者。 首先,C++11标准引入了线程库 `&lt;thread&gt;`,使得在C++中进行多线程编程变得更为便捷。...

    易语言-多线程写法(精易模块线程池和鱼刺模块线程池)

    通过分析这些代码,我们可以学习到如何在易语言中有效地使用多线程,如何设计和实现线程池,以及如何根据具体需求选择合适的线程池实现。 总的来说,易语言的多线程写法,尤其是精易模块线程池和鱼刺模块线程池,为...

    C/C++线程池 vs2010下编译(包含整个项目)

    一个简单的线程池可能包含以下几个关键部分: 1. **线程类**:这是线程池中的基本元素,用于执行具体的任务。线程类应包括启动、停止、获取状态等功能,同时需要实现线程的同步和通信机制,如使用条件变量或互斥量...

    最简单的IOCP服务器程序例子

    通过阅读和分析源代码,你可以更深入地了解IOCP的工作原理和如何在实际项目中应用。 总结来说,IOCP服务器程序通过异步I/O和线程池机制实现了高效的并发处理能力。这个例子是学习Windows系统级编程,特别是网络服务...

    J2ME手机聊天室例子

    J2ME可能不支持复杂的对象序列化,所以我们可能需要自定义简单的数据格式,如XML或JSON,来传递聊天消息。在发送和接收数据时,我们需要使用DataInputStream和DataOutputStream进行字节流的读写操作。 安全性是任何...

    android 例子汇总源码

    15. **多线程与线程池**:源码可能包含线程池的使用,以提高多任务执行效率。 以上只是部分可能涵盖的知识点,具体的学习内容将取决于压缩包中的每个例子。通过分析和实践这些源码,开发者可以提升对Android开发的...

    一个COM的小例子!

    例如,组件可能需要通过注册表存储其信息,或者使用线程池来提高性能。"资源"则可能指界面元素如图标、字符串、菜单等,这些资源可以在组件中统一管理和使用。 在"COMDemo"中,可能会有一个演示如何创建和使用系统...

    iocp开发一个最简单的例子

    接下来,我们分析一下给定的文件列表: 1. **IOCP.cpp**:这是主要的源代码文件,包含IOCP的实现逻辑,如创建IOCP对象、注册I/O操作、接收和处理完成端口上的事件等。 2. **stdafx.cpp**:预编译头文件,通常包含...

    100+条JAVA例子源代码

    例子可能包含创建简单的类,如学生类,展示如何定义属性和方法,并实例化对象。继承的例子可能会展示一个基类和一个或多个子类的关系,以及如何覆盖或扩展基类的方法。多态性的例子则可能涉及到接口和抽象类的使用。...

    学习JAVA的经典小例子

    例如,一个简单的例子可能是创建一个“学生”类,然后演示如何实例化对象并调用其方法。 异常处理也是Java编程中不可忽视的部分。在压缩包中,可能会找到关于try-catch-finally块的实例,用于演示如何捕获和处理...

    linux下多线程读写socket的简单例子

    在提供的压缩包文件"linux下多线程读写socket的简单例子.mht"中,应该包含了一个简单的示例代码,通过阅读和分析这个代码,你可以更好地理解和掌握这些知识点,并实践在自己的项目中。对于初学者来说,这是一个很好...

    C# IOCP高性能 SOCKET并发完成端口例子(有C#客户端)完整实例源码

    本文将详细解析标题为“C# IOCP高性能 SOCKET并发完成端口例子(有C#客户端)完整实例源码”的技术知识点,以及如何利用C#进行IOCP(I/O完成端口)开发,实现广域网下的高效SOCKET通信。 首先,我们要理解什么是...

    java2实用教程(第3版例子代码).rar

    通过分析这些例子,我们可以深入学习以下几个重要的Java知识点: 1. **基础语法**:Java的基础语法是编程的基石,包括变量声明、数据类型、运算符、流程控制(如if语句、switch语句、for循环、while循环)等。书中...

Global site tag (gtag.js) - Google Analytics