package QQ;

import java.util.LinkedList;

/**
* Created by hu on 2015/11/9.
*/
public class ThreadPool extends ThreadGroup{
//线程池是否关闭
private boolean isClosed=false;
//表示工作队列
private LinkedList<Runnable> workQueue;
//表示线程池ID
private static int threadPoolId;
//表示工作线程ID
private int threadId; public ThreadPool(String name) {
super(name);
}
/**
* poolSize指定线程池中工作线程的数目
* */
public ThreadPool(int poolSize){
this("ThreadPool-"+(threadPoolId++));
setDaemon(true);
//创建工作队列
workQueue=new LinkedList<Runnable>();
for(int i=0;i<poolSize;i++){
//创建并启动工作线程
new WorkThread().start();
}
}
/**
* 向工作队列中加入一个新任务,由工作线程去执行该任务
* */
public synchronized void execute(Runnable task){
//线程池被关闭则抛出异常
if(isClosed){
throw new IllegalStateException();
}
if(task!=null){
//将任务添加到工作队列中去
workQueue.add(task);
//唤醒正在getTask()方法中等待任务的工作线程
notify();
}
}
/**
* 从工作队列中取出一个任务,工作线程会调用此方法
* */
protected synchronized Runnable getTask() throws InterruptedException {
while (workQueue.size()==0){
if(isClosed)
return null;
//如果工作队列中没有任务,就等待任务
wait();
}
//取出队列中的第一个任务
return workQueue.removeFirst();
}
/**
* 关闭线程池
* */
public synchronized void close(){
if(isClosed){
isClosed=true;
//清空工作队列
workQueue.clear();
//中断所有工作进程,该方法继承自ThreadGroup类
interrupt();
}
}
/**
* 等待工作进程把所有任务执行完
* */
public void join(){
synchronized (this){
isClosed=true;
//唤醒还在getTask()方法中等待任务的工作进程
notifyAll();
}
Thread[] threads=new Thread[activeCount()];
//enumerate()方法继承自ThreadGroup类,获得线程中当前所有活着的工作线程
int count=enumerate(threads);
for(int i=0;i<count;i++){
try{
//等待工作线程运行结束
threads[i].join();
}catch (InterruptedException ex){
ex.printStackTrace();
}
}
}
private class WorkThread extends Thread{
public WorkThread(){
//加入到当前ThreadPool线程组中
super(ThreadPool.this,"WorkThread-"+(threadPoolId++));
}
public void run(){ while (!isInterrupted()){
Runnable task=null;
try{
//取出任务
task=getTask();
}catch (InterruptedException ex){
ex.printStackTrace();
}
//如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
if(task==null)
return;
try{
//运行任务,异常在catch块中捕获
task.run();
}catch (Throwable t){
t.printStackTrace();
}
}
}
}
}

  

java网络编程学习笔记(四):线程池的实现的更多相关文章

  1. Java网络编程学习笔记

    Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...

  2. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  3. java 网络编程学习笔记

    1.IP地址 IP地址组成:网络号段+主机号段 IP地址分类: A类:第一号段为网络号段+后三段的主机号段 1.0.0.1---127.255.255.254(10.x.x.x是私有地址) 一个网络号 ...

  4. java网络编程学习笔记(二):socket详解

    1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会 ...

  5. java网络编程学习笔记(三):ServerSocket详解

    1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...

  6. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  7. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  8. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  9. JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析

    JUC源码学习笔记5--线程池,FutureTask,Executor框架源码解析 源码基于JDK8 参考了美团技术博客 https://tech.meituan.com/2020/04/02/jav ...

随机推荐

  1. 【转】html树形菜单控件

    Query plugin: Treeview  这个插件能够把无序列表转换成可展开与收缩的Tree. 主页:http://bassistance.de/jQuery-plugins/jquery-pl ...

  2. 第39-43课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)

    目录 功能一:利用后置勾子,处理好商品主键id,会员的价格,再插入member_price表里. 要实现的功能: 思路: html里 控制器里 模型里的后置勾子afterInsert() 功能二:利用 ...

  3. Spark架构与作业执行流程简介(scala版)

    在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此: 字面意思就是弹性分布式数据集,是spark中最基本的数 ...

  4. python3.7 迭代器和生成器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1.迭代器协议是指:对象 ...

  5. windows7下将Cygwin加入右键菜单,并从当前目录打开

    第一步:修改windows注册表 1·开始->运行(或者win键+R),输入REGEDIT,回车,打开注册表编辑器: 2·找到HKEY_CLASSES_ROOT\Directory\Backgr ...

  6. 2017 ACM/ICPC Shenyang Online SPFA+无向图最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  7. HDU:2846-Repository

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2846 Repository Time Limit: 2000/1000 MS (Java/Others) ...

  8. jmeter XML格式的结果中各属性的含义

    最近在搞jmeter,生成xml的测试报告,对报告字段进行解释,可能是自己不会找,网上资源不多,好不容易找到的,记录下来: 感谢博主:http://blog.163.com/zhang_jing/bl ...

  9. wget常用下载命令

    wget wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理.wget名称的由来是“World Wide Web ...

  10. input框中的必填项之取消当前input框为必填项

    html5新增了一个required属性,可以使用这个属性对文本框设置必填项,直接在input文本框上添加required即可 . 效果如图: