java网络编程学习笔记(四):线程池的实现
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网络编程学习笔记(四):线程池的实现的更多相关文章
- Java网络编程学习笔记
Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...
- java网络编程学习笔记(一)
1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...
- java 网络编程学习笔记
1.IP地址 IP地址组成:网络号段+主机号段 IP地址分类: A类:第一号段为网络号段+后三段的主机号段 1.0.0.1---127.255.255.254(10.x.x.x是私有地址) 一个网络号 ...
- java网络编程学习笔记(二):socket详解
1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会 ...
- java网络编程学习笔记(三):ServerSocket详解
1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析
JUC源码学习笔记5--线程池,FutureTask,Executor框架源码解析 源码基于JDK8 参考了美团技术博客 https://tech.meituan.com/2020/04/02/jav ...
随机推荐
- python用requests请求,报SSL:CERTIFICATE_VERIFY_FAILED错误。
response = requests.request("GET", url, headers=headers, params=querystring, verify=False) ...
- linux正则表达式扩展部分
扩展的正则表达式(Extended Regular Expressions): 使用的命令为:grep -E以及egrep [了解即可] 1)+ 表示重复“一个或一个以上”前面的字符(*是0或多 ...
- jQuery的三种写法
jQuery的三种写法 jQuery一共有三种写法,写法如下: <script type="text/javascript" src="js/jquery-1.9. ...
- 调用python-nmap实现扫描局域网存活主机
使用环境:Raspberry 3b+ +netifaces+python-nmap+nmap 调用netifaces自动获取ip地址: def get_gateways(): return netif ...
- Python中的bytes
bytes_lst = [ ('创建bytes',), ('bytes可哈希',), ('编码与解码',), ('常见编码类型',), ('ord() 与 chr()',), ] 创建bytes &g ...
- 893E - Counting Arrays
E. Counting Arrays time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- git 远程仓库 与本地项目 挂钩 全过程
摘要:学了Android 快三个月了,依旧不会git,真的有些丢人.git是一个非常棒的团队协作的工具.其实也是分分钟的事情.Follow Me! Step 1 在码云上新建一个项目,作为远程仓库.里 ...
- Android开发——用户在屏幕上的手势识别
个定点决定.四个属性分别为left(1),top(2),right(3),bottom(4). 数字为图上标出的距离.显然这四个属性是相对于父容器来定的,均可以通过get()方法获取. 因此很容易得出 ...
- 4 Template层 -定义模板
1.模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一 ...
- 等比例适配所有屏幕---css3 rem用法
1,rem的定义 rem(font size of the root element)是指相对于根元素的字体大小的单位.rem是一个相对单位.和em非常相似.em(font size of the e ...