- 浏览: 401620 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
handong1587:
代码有一处错.query函数最后一行return的应该是:re ...
RMQ -
yuandong0828:
简洁的特别透彻细致,多谢,
虚函数、虚指针和虚表 -
adam_zs:
谢谢分享!
括号匹配问题 -
hongloumengyanzxw:
good[b][/b]
dup和dup2函数 -
chriszeng87:
最后第二种情况右下角的那个点是不是可以看作相交点的?上面的那种 ...
判断两个链表是否相交
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;如果线程少了会浪费系统资源,多了又会造成系统拥挤效率不高。用线程池控制线程数量,使得其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有任务等待进程,则线程池中的线程处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。也可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)
线程池类
import java.util.LinkedList; public class ThreadPool extends ThreadGroup { private boolean isClosed = false; //线程池是否关闭 private LinkedList workQueue; //工作队列 private static int threadPoolID = 1; //线程池的id public ThreadPool(int poolSize) { //poolSize 表示线程池中的工作线程的数量 super(threadPoolID + ""); //指定ThreadGroup的名称 setDaemon(true); //继承到的方法,设置是否守护线程池 workQueue = new LinkedList(); //创建工作队列 for(int i = 0; i < poolSize; i++) { new WorkThread(i).start(); //创建并启动工作线程,线程池数量是多少就创建多少个工作线程 } } /** 向工作队列中加入一个新任务,由工作线程去执行该任务*/ public synchronized void execute(Runnable task) { if(isClosed) { throw new IllegalStateException(); } if(task != null) { workQueue.add(task);//向队列中加入一个任务 notify(); //唤醒一个正在getTask()方法中待任务的工作线程 } } /** 从工作队列中取出一个任务,工作线程会调用此方法*/ private synchronized Runnable getTask(int threadid) throws InterruptedException { while(workQueue.size() == 0) { if(isClosed) return null; System.out.println("工作线程"+threadid+"等待任务..."); wait(); //如果工作队列中没有任务,就等待任务 } System.out.println("工作线程"+threadid+"开始执行任务..."); return (Runnable) workQueue.removeFirst(); //返回队列中第一个元素,并从队列中删除 } /** 关闭线程池 */ public synchronized void closePool() { if(! isClosed) { waitFinish(); //等待工作线程执行完毕 isClosed = true; workQueue.clear(); //清空工作队列 interrupt(); //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类 } } /** 等待工作线程把所有任务执行完毕*/ public void waitFinish() { synchronized (this) { isClosed = true; notifyAll(); //唤醒所有还在getTask()方法中等待任务的工作线程 } Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。 int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程 for(int i =0; i < count; i++) { //等待所有工作线程结束 try { threads[i].join(); //等待工作线程结束 }catch(InterruptedException ex) { ex.printStackTrace(); } } } /** * 内部类,工作线程,负责从工作队列中取出任务,并执行 */ private class WorkThread extends Thread { private int id; public WorkThread(int id) { //父类构造方法,将线程加入到当前ThreadPool线程组中 super(ThreadPool.this,id+""); this.id =id; } public void run() { while(! isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断 Runnable task = null; try { task = getTask(id); //取出任务 }catch(InterruptedException ex) { ex.printStackTrace(); } //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程 if(task == null) return; try { task.run(); //运行任务 }catch(Throwable t) { t.printStackTrace(); } }// end while }// end run }// end workThread }
测试类
public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池 Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行 //运行任务 for (int i = 0; i <=5 ; i++) { //创建6个任务 threadPool.execute(createTask(i)); } threadPool.waitFinish(); //等待所有任务执行完毕 threadPool.closePool(); //关闭线程池 } private static Runnable createTask(final int taskID) { return new Runnable() { public void run() { System.out.println("Task" + taskID + "开始"); System.out.println("Hello world"); System.out.println("Task" + taskID + "结束"); } }; } }
原文地址:http://sunnylocus.iteye.com/blog/223327
发表评论
-
Java类加载器
2011-10-21 18:57 1184Java虚拟机中可以安装多 ... -
stop() 和 suspend() 方法为何不推荐使用
2011-10-21 15:39 1763反对使用stop(),是因为它不安全。它会解除由线程获取 ... -
使用阻塞缓冲区的生产者消费者
2011-10-07 19:59 1206Repository 重点在于Rep ... -
生产者消费者问题
2011-10-07 19:47 1639生产者消费者问题 生产者消费者问题是研究多线程程序 ... -
Java中从方法中返回多个值
2011-09-28 21:42 6510有些时候,我们需要从一个方法中返回多个值。那么在Java中该怎 ... -
遍历List时删除元素
2011-09-14 13:23 2377一般调用删除方法都是集合的方法,例如: List ... -
closure和callback
2011-09-12 22:24 1399闭包(closure)是一个可调用的对象,它记录了一些信息 ... -
倒排索引的简单实现
2011-09-06 20:33 12759首先看一个例子: 假设有3篇文章,file1, ... -
Java是解释型还是编译型
2011-09-01 19:58 1158Java程序需要编译,但是没有直接编译成机器语言,而是编译成. ... -
Java Socket网络编程
2011-09-01 11:34 1483在网络编程中,最基本的操作就是在两台机器之间建立点对点通信,S ... -
使用Java调用C/C++
2011-08-31 23:36 8373我们知道Java是一种平台 ... -
super.getClass()陷阱
2011-08-31 15:25 1209先给出一个问题,下面程序的输出结果是多少? impor ... -
一些java的面试题
2011-08-31 11:46 13281、一个".java"源文件中是否可以包括 ... -
Java中的文件操作
2011-08-30 22:46 998使用Java实现一些文件操作。 import j ... -
JDK1.5中的线程池
2011-08-29 22:50 907在JDK1.5中,线程池类为 ... -
java thread中的run()和start()
2011-08-29 21:28 1307当调用start()后,此线程就处于就绪状态,但并没有运行。之 ... -
嵌套类和内部类的区别
2011-08-28 21:39 18401. 内部类的对象隐含一个外部类的对象引用,可以直接引用 ... -
JVM垃圾回收机制
2011-08-28 21:12 5891. JVM的gc概述 gc即垃圾收集机制是指 ... -
new class[0]
2011-07-28 23:59 1570new Class[0]表示有零个元素的Class数组,即空数 ... -
在两台计算机上使用RMI进行远程方法调用
2011-06-20 22:05 2206RMI概述 远程方法调用就是本地对象能够调 ...
相关推荐
自定义实现Java线程池,学习大师设计思想,瞻仰大神笔法
// 如果实际线程数量小于核心线程数,if (getWorkCount() )// 初始化线程执行任务else if (work
1. 初始化线程执行提交的任务 2. 任务执行不过来,放入工作队列 3. 任务过多,线程和队列均处理不过来,拒绝执行(本文中将抛出RejectedExecuti
Java线程池的原理与实现 Java线程池的原理与实现
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
NULL 博文链接:https://yulincqupt.iteye.com/blog/1673919
java线程池的原理和实现,挺全面的,分享给大家!
基于Java线程池技术的数据爬虫设计与实现.pdf
JAVA线程池的原理与实现.pdf
本文旨在使用Java语言编写一个通用的线程池。当需要使用线程池处理事务时,只需按照指定规范封装好事务处理对象,然后用已有的线程池对象去自动选择空 闲线程自动调用事务处理对象即可。并实现线程池的动态修改...
Java实现通用线程池
NULL 博文链接:https://j2ee2009.iteye.com/blog/689161
Java版线程池实现
用java实现的线程池,自己是初学着,程序参考网上。
java实现通用的线程池,这是我网上找的资料,O(∩_∩)O~希望大家能用的到。
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
NULL 博文链接:https://hoochiang.iteye.com/blog/2357124
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了...