`
jdw
  • 浏览: 158875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

建立自己的JAVA线程池

    博客分类:
  • java
阅读更多

为什么要建立线程池?

 

在多线程项目中,如果建立的线程过多,反而可能导致运行速度大大减慢,这是由于线程建立所花费的时间和资源都比较多。
所以我们在多线程中必须很好地来管理线程, 在很好利用多线程能“同步工作”的好处之外,更有效地提高程序运行速度。

 

线程池是什么?

 

线程池是指具有固定数量的线程组成的一种组件。这些线程用来循环执行多个应用逻辑。

 

怎么建立线程池?

 

线程池主要包括4个部分,它们是:
1. 线程管理
 

主要是用来建立,启动,销毁工作线程和把工作任务加入工作线程。

 

2. 工作线程
 

它是真正的线程类,运行工作任务。

 

3. 工作队列
 

它是用来封装线程的容器。


4. 工作任务
 

它是实现应用逻辑的具体类。

 

 线程管理类:

import java.util.ArrayList;    
import java.util.List;    
import java.util.Queue;    
import java.util.concurrent.ConcurrentLinkedQueue;    
   
/**   
 * ThreadPoolManager.java   
 *   
 * Copyright (C)  2008 State Street Corporation. All Rights Reserved.   
 *   
 */   
   
/**   
 * the thread pool manager, is responsible for starting and stopping the work thread.   
 *    
 * @author  e458487   
 * @version 1.0   
 */   
public class ThreadPoolManager {    
   
    private static final int DEFAULT_POOL_SIZE = 4;    
    private List<WorkThread> threadPool;    
    private Queue<Task> taskQueue;    
    private int poolSize;    
        
    public ThreadPoolManager() {    
        this(DEFAULT_POOL_SIZE);    
    }    
        
    public ThreadPoolManager(int poolSize) {    
        if(poolSize <= 0) {    
            this.poolSize = DEFAULT_POOL_SIZE;    
        }else {    
            this.poolSize = poolSize;    
        }    
        threadPool = new ArrayList<WorkThread>(this.poolSize);    
        taskQueue = new ConcurrentLinkedQueue<Task>();    
        startup();    
    }    
        
    public void startup() {    
        System.out.println("start work thread...");    
        synchronized(taskQueue) {    
            for(int i = 0; i < this.poolSize; i++) {    
                WorkThread workThread = new WorkThread(taskQueue);    
                threadPool.add(workThread);    
                workThread.start();    
            }    
        }    
    }    
        
    public void shutdown() {    
        System.out.println("shutdown work thread...");    
        synchronized(taskQueue) {    
            for(int i = 0; i < this.poolSize; i++) {    
                threadPool.get(i).shutdown();    
            }               
                
            System.out.println("done...");    
        }    
    }    
        
    public void addTask(Task task) {    
        synchronized(taskQueue) {    
            taskQueue.add(task);    
            taskQueue.notify();    
        }    
    }    
}

 

 

工作线程类:

import java.util.Queue;    
   
/**   
 * WorkThread.java   
 *   
 * Copyright (C)  2008 State Street Corporation. All Rights Reserved.   
 *   
 */   
   
/**   
 * the work thread used pull the task of task queue, and execute it.   
 *    
 * @author  e458487   
 * @version 1.0   
 */   
public class WorkThread extends Thread {    
   
    private boolean shutdown = false;    
    private Queue<Task> queue;    
        
    public WorkThread(Queue<Task> queue) {    
        this.queue = queue;    
    }    
        
    public void run() {    
        while(!shutdown) {    
            try {    
                Thread.sleep(1000);    
            } catch (InterruptedException e1) {    
                e1.printStackTrace();    
            }    
            System.out.println(Thread.currentThread() + " is running...");    
            synchronized(queue) {    
                if(!queue.isEmpty()) {    
                    Task task = queue.poll();    
                    task.execute();    
                }else {    
                    try {    
                        queue.wait(1000);    
                        System.out.println(Thread.currentThread() + " wait...");    
                    }catch(InterruptedException e) {    
                            
                    }    
                }    
            }    
        }    
    }    
        
    public void shutdown() {    
        shutdown = true;    
    }    
}

 

 

工作任务接口:

 

/**   
 * Task.java   
 *   
 * Copyright (C)  2008 State Street Corporation. All Rights Reserved.   
 *   
 */   
   
/**   
 * The task want to execute.   
 *    
 * @author  e458487   
 * @version 1.0   
 */   
public interface Task {    
   
    public void execute();    
}

 

 

工作任务类:

/**   
 * SimpleTask.java   
 *   
 * Copyright (C)  2008 State Street Corporation. All Rights Reserved.   
 *   
 */   
   
/**   
 * @author  e458487   
 * @version 1.0   
 */   
public class SimpleTask implements Task {    
   
    /* (non-Javadoc)   
     * @see Task#execute()   
     */   
    public void execute() {    
        System.out.println(Thread.currentThread());    
    }    
   
}

 

 

 

 

线程池测试类:

 

/**   
 * ThreadPoolDemo.java   
 *   
 * Copyright (C)  2008 State Street Corporation. All Rights Reserved.   
 *   
 */   
   
/**   
 * @author  e458487   
 * @version 1.0   
 */   
public class ThreadPoolDemo {    
   
    public static void main(String[] args) {    
        ThreadPoolManager threadMg = new ThreadPoolManager();    
            
        for(int i = 0; i < 50; i++) {    
            threadMg.addTask(new SimpleTask());    
        }    
        try {    
            Thread.sleep(5000);    
        } catch (InterruptedException e) {    
            e.printStackTrace();    
        }    
        threadMg.shutdown();    
    }       
}

 

分享到:
评论

相关推荐

    深入java线程池的使用详解

    5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ...

    JAVA网络编程课程设计

    使用Java作为语言基础,服务端使用线程池管理线程,客户端分为读写两个线程分别管理Socket读写操作。其中服务端为解决多线程操作共享资源,确保线程安全摒弃资源消耗大的Synchronized使用ConcurrentHashMap存放...

    java jdk实列宝典 光盘源代码

    telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    Java版精华区 含java jsp及js等精华帖子合集 适合收藏 查询 &lt;br&gt;序号 精华区主题 -------------------------------- 1. [目录]Java教程 1. [目录]Java语言教程 2. [目录]来自java的传说...

    Java并发编程实践 PDF 高清版

    5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 Executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...

    JAVA面试题最全集

    使用socket建立客户端与服务器的通信的过程 60.JAVA语言国际化应用,Locale类,Unicode 61.描述反射机制的作用 62.如何读写一个文件? 63.在图形界面中,一个按钮如何处理鼠标点击事件? 64.在图形界面中,一个...

    Java在线聊天系统.rar

    一、搭建服务器端 a)、创建ServerSocket对象绑定监听端口。...d)、关闭响应资源这个项目非常适合学完Java基础来练手,该项目就是对Socket网络编程、IO流、线程及线程池等知识进行一些实战综合运用。

    JAVA并发编程实践_中文版(1-16章全)_1/4

    5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...

    isolation-threadpool:从Hystrix核心代码中提取出来的线程池隔离的代码,可以非常方便的在Web应用中实现线程池隔离

    大多数线程阻塞等待数据响应返回,新的请求无法建立SSL连接,导致整个Jetty线程池都被该服务占用,最终拖垮了整个Jetty,因此我们有必要能把不同HTTP服务隔离到不同的线程池中,即使其中某个HTTP服务的线程池满了也...

    Java SE实践教程 源代码 下载

    6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    6.3.1 线程池和Executor 124 6.3.2 Callable和Future 126 6.3.3 ScheduledExecutorService 127 6.4 线程安全的集合和同步器 128 6.4.1 阻塞队列 128 6.4.2 指定阻塞时间 130 6.4.3 同步器 131 6.4.4 Atomic...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    java并发编程理论基础精讲

    本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...

    Java并发编程part2

    5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...

    java范例开发大全

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...

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

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...

    Java并发编程实践part1

    5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...

Global site tag (gtag.js) - Google Analytics