线程池原理基础理解:

线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行。直到队列中的线程为空。实例代码如下:

package xianchengchi;

/**

* @author 作者 刘小明

* @email ruanjianlxm@sina.com

* @version 创建时间:2014年8月16日 下午11:39:53

* 类说明

*/

//测试线程池

public class TestThreadPool {

public static void main(String[] args) {

// 创建3个线程的线程池

ThreadPool t = ThreadPool.getThreadPool(3);

t.execute(new Runnable[] { new Task(), new Task(), new Task(),new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task() });

// t.execute(new Runnable[] { new Task(), new Task(), new Task() });

System.out.println("ttttttttttt__________-"+t);

t.destroy();// 所有线程都执行完成才destory

System.out.println(t);

}

// 任务类

static class Task implements Runnable {

private static volatile int i = 1;

@Override

public void run() {// 执行任务

System.out.println("任务 " + (i++) + " 完成");

}

}

}

package xianchengchi;

/**

* @author 作者 刘小明

* @email ruanjianlxm@sina.com

* @version 创建时间:2014年8月16日 下午11:39:28

* 类说明

*/

import java.util.LinkedList;

import java.util.List;

/**

* 线程池类,线程管理器:创建线程,执行任务,销毁线程,获取线程基本信息

*/

public final class ThreadPool {

// 线程池中默认线程的个数为5

private static int worker_num = 5;

// 工作线程

private WorkThread[] workThrads;

// 未处理的任务

private static volatile int finished_task = 0;

// 任务队列,作为一个缓冲,List线程不安全

private List taskQueue = new LinkedList();

private static ThreadPool threadPool;

// 创建具有默认线程个数的线程池

private ThreadPool() {

this(5);

}

// 创建线程池,worker_num为线程池中工作线程的个数

private ThreadPool(int worker_num) {

ThreadPool.worker_num = worker_num;

workThrads = new WorkThread[worker_num];

for (int i = 0; i

workThrads[i] = new WorkThread();

workThrads[i].start();// 开启线程池中的线程

}

}

// 单态模式,获得一个默认线程个数的线程池

public static ThreadPool getThreadPool() {

return getThreadPool(ThreadPool.worker_num);

}

// 单态模式,获得一个指定线程个数的线程池,worker_num(>0)为线程池中工作线程的个数

// worker_num<=0创建默认的工作线程个数

public static ThreadPool getThreadPool(int worker_num1) {

if (worker_num1 <= 0)

worker_num1 = ThreadPool.worker_num;

if (threadPool == null)

threadPool = new ThreadPool(worker_num1);

return threadPool;

}

// 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(Runnable task) {

synchronized (taskQueue) {

taskQueue.add(task);

taskQueue.notify();

}

}

// 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(Runnable[] task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

/*  // 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(List task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

*/

// 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁

public void destroy() {

while (!taskQueue.isEmpty()) {// 如果还有任务没执行完成,就先睡会吧

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 工作线程停止工作,且置为null

for (int i = 0; i

workThrads[i].stopWorker();

workThrads[i] = null;

}

threadPool=null;

taskQueue.clear();// 清空任务队列

System.out.println("销毁了线程池");

}

// 返回工作线程的个数

public int getWorkThreadNumber() {

return worker_num;

}

// 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完成

public int getFinishedTasknumber() {

return finished_task;

}

// 返回任务队列的长度,即还没处理的任务个数

public int getWaitTasknumber() {

return taskQueue.size();

}

// 覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数

@Override

public String toString() {

return "WorkThread number:" + worker_num + "  finished task number:"

+ finished_task + "  wait task number:" + getWaitTasknumber();

}

/**

* 内部类,工作线程

*/

private class WorkThread extends Thread {

// 该工作线程是否有效,用于结束该工作线程

private boolean isRunning = true;

/*

* 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待

*/

@Override

public void run() {

Runnable r = null;

while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了

synchronized (taskQueue) {

while (isRunning && taskQueue.isEmpty()) {// 队列为空

try {

taskQueue.wait(20);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (!taskQueue.isEmpty())

r = taskQueue.remove(0);// 取出任务

}

if (r != null) {

r.run();// 执行任务

}

finished_task++;

r = null;

}

}

// 停止工作,让该线程自然执行完run方法,自然结束

public void stopWorker() {

isRunning = false;

}

}

}

java 线程池的理解_JAVA线程池原理的理解相关推荐

  1. java线程池的应用_Java线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. java 线程池 源码_java线程池源码分析

    我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...

  3. java线程池 的方法_JAVA线程池的实现方法

    我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题. 线程池的基本原理是,首先创建并保持一定数量的线程,当需要使 ...

  4. java线程池多线程优先级_Java线程优先级

    java线程池多线程优先级 Priority of a thread describes how early it gets execution and selected by the thread ...

  5. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  6. java线程池的概念_Java线程池的基本概念以及生命周期

    一.为什么要实现线程池? 线程的创建与销毁对于CPU而言开销较大,通过池化技术可避免重复的创建与销毁线程. 方便与线程资源统一管理. 二.几种常见的线程池以及核心参数 不推荐使用Executor创建线 ...

  7. java 线程池 资源回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  8. java低层源码_Java线程池及其底层源码实现分析

    */ Callable接口 && Runnable接口 callable调用call方法 runnable调用run方法 都可以被线程调用,但callable的call方法具有返回值( ...

  9. java常量池的理解_Java常量池的大概理解

    转载自:http://www.cnblogs.com/iyangyuan/p/4631696.html 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转 ...

最新文章

  1. springcloud微服务总结四 负载均衡
  2. 实战SSM_O2O商铺_24【商铺列表】View层开发
  3. SqlServerCe 数据库操作示例
  4. python中dict函数_dict()函数以及Python中的示例
  5. 波音737-800座位图哪个好_「科普」汽车哪个座位才安全?很多人都不知道
  6. SAP License:GR与IR
  7. 我只是追个直播,结果被拉进大咖们的群面对面群聊……
  8. c++时间片轮转rr进程调度算法_「学习笔记」时间片轮转(RR)调度算法(详解版)...
  9. System Center 2012 R2 支持的SQL版本
  10. 抓取mooc中国随笔
  11. AUTOCAD 绘图技巧
  12. html光圈效果,PS新手教程:特效光圈效果
  13. ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
  14. 百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题
  15. uni-app入门教程
  16. 51单片机 仿真器驱动安装失败
  17. 华为MateBook E二合一笔记本发布:首次采用OLED原色屏
  18. 实在智能签约上海联通,共创美好智慧生活
  19. 公司给你调岗降薪,逼你主动辞职如何应对?
  20. 时间复杂度的三种常见表示符号

热门文章

  1. 破坏计算机系统既遂的标准,破坏计算机信息系统罪的量刑标准是什么
  2. Javaweb经典三层架构的演变
  3. Java集合(7):散列与散列码
  4. zipline-benchmarks.py文件改写
  5. ApplicationContext容器的设计原理
  6. 从根本上解决 Infopath 2010 重复表的序号问题
  7. linux spinlock/rwlock/seqlock原理剖析(基于ARM64)
  8. emmc固件开发_UP2开发板简易开箱(二)
  9. java .jvp文件_GitHub - eddylapis/jvppeteer: Headless Chrome For Java (Java 爬虫)
  10. sox处理mp3_SoX 音频处理工具使用方法