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. linux替换yum源及配置本地源

    linux系统安装后自带的bash源由于在国外,安装软件包的时候会非常慢,最好替换一下yum源. ​关于yum源的简单介绍 ​           yum的主要功能是更方便地添加,删除和更新rpmba ...

  2. 背景透明度处理 兼容IE

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. php获取随机字符串

    获取随机字符串 /** * 获取随机字符串 * @param int $randLength 长度 * @param int $addtime 是否加入当前时间戳 * @param int $incl ...

  4. 【PHP】常用的PHP正则表达式收集整理

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff]评注:可以用来计算字符串的长度 ...

  5. 03.VUE学习之动态绑定值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. poj 3259 时光穿梭问题 bellman_ford算法

    题意:有n个空地,有m条双向大路,w条时光隧道单向路.问能否回到过去? 思路:判断是否有负环存在,如果有负环存在那么就可以一直小就可以回到过去了 创建源顶点 V到其他顶点的距离d 初始为INF d[1 ...

  7. 笔记-python-build-in-types

    笔记-python-build-in-types 注:文档内容来源为Python 3.6.5 documentation 1.      built-in types 1.1.    真值测试 所有对 ...

  8. 【Single Num II】cpp

    题目: Given an array of integers, every element appears three times except for one. Find that single o ...

  9. RSA进阶之两个N的公约数

    适用场景: 给你两个n,n1和n2. 两个数都很大,不好分解. 但是这数刚好有质数公因子(试试欧几里得辗转相除跑完之后,就是不断地相除就可以了,4000多位也是很快的),那不就相当于间接的分解出q或者 ...

  10. Redis 配置登录密码

    1. 通过配置文件进行配置 打开 redis.conf,找到 #requirepass foobared 去掉行前的注释,并修改密码为所需的密码,保存文件 重启redis sudo service r ...