- 浏览: 176779 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenyi1125:
StateStats 是自己定义的类吧,有哪些属性,如何与我 ...
mongodb sum 操作 -
yongquan812:
...
最全的 Twitter Bootstrap 开发资源清单 -
mccxj:
不是已经提供个params的属性来添加路径的参数了么?我对分页 ...
grails 查询结果分页 简单实现 -
sphinxdwood:
请问第22行有什么用?params.ft_inlist = K ...
grails 查询结果分页 简单实现 -
walsh:
classpath的配置不正确吧
java基础
1 .线程池类:TPTaskProxy
import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class TPTaskProxy { private static Log log = LogFactory.getLog(TPTaskProxy.class); /** * 添加任务并唤醒各因无任务而等待的空闲线程 * * @param task * @throws JobException */ public void executeTask(TPTask task) { synchronized (taskQueue) { try { taskQueue.add(task); taskQueue.notifyAll(); } catch (Exception e) { } } } public static int DEFAULT_POOL_SIZE = 10; /** * 任务队列 */ private Queue<TPTask> taskQueue; /** * 空闲线程 */ private Queue<TPTaskThread> idleThread; /** * 线程池大小 */ private int taskPoolSize ; public int getQueueSize(){ return taskQueue.size(); } public TPTaskProxy() { if (taskPoolSize < 0) { this.taskPoolSize = DEFAULT_POOL_SIZE; } taskQueue = new ConcurrentLinkedQueue<TPTask>(); idleThread = new ConcurrentLinkedQueue<TPTaskThread>(); } /** * 初始化线程池,新建 N 个空闲线程 * */ public void init() { log.debug("init"); log.debug("taskPoolSize="+taskPoolSize); for (int i = 0; i < taskPoolSize; i++) { TPTaskThread taskThread = new TPTaskThread(this, taskQueue,"Thread " + i); idleThread.add(taskThread); taskThread.start(); } } /** * 关闭线程池,关闭线程池中各个线程 在调用该方法后,线程并没有马上关闭,而是在线程任务执行完之后关闭 * */ public void shutDown() { synchronized (taskQueue) { for (TPTaskThread thread : idleThread) { thread.shutDown(); } } } public void startAll() { synchronized (taskQueue) { for (TPTaskThread thread : idleThread) { thread.setBegin(true); } taskQueue.notifyAll(); } } public void stopAll() { synchronized (taskQueue) { for (TPTaskThread thread : idleThread) { thread.setBegin(false); } } } /** * 获取空闲线程,当线程池内无空闲线程时等待 * * @return * @throws JobException */ public TPTaskThread getIdleThread(){ if (idleThread.isEmpty()) { try { idleThread.wait(); } catch (InterruptedException e) { } } synchronized (idleThread) { return idleThread.poll(); } } /** * 释放线程 * * @param thread */ public void releaseThread(TPTaskThread thread) { synchronized (idleThread) { idleThread.add(thread); idleThread.notifyAll(); } } public void setTaskPoolSize(int taskPoolSize) { this.taskPoolSize = taskPoolSize; } }
2 .线程实现类:TPTaskThread
import java.util.Queue; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class TPTaskThread extends Thread{ private static Log log = LogFactory.getLog(TPTaskThread.class); /** * 线程关闭的标识位 */ private boolean shutDown = false; private boolean begin = true; /** * 任务队列 */ private Queue<TPTask> taskQueue; private TPTaskProxy persistentProxy; public TPTaskThread(TPTaskProxy persistentProxy, Queue<TPTask> taskQueue, String name) { super(name); log.debug("make "+this); System.out.println("make :::"+this); this.taskQueue = taskQueue; this.persistentProxy = persistentProxy; } public void shutDown() { this.shutDown = true; } public void setBegin(boolean begin){ this.begin = begin; } public void run() { while(!shutDown) { TPTask task; // 如果任务队列不为空,则取出一个任务并开始执行,否则线程等等 if(!taskQueue.isEmpty() && begin) { synchronized(taskQueue) { task = taskQueue.poll(); } //多线程抢task,如果没有抢到,直接release. if(task!=null) task.doTask(); // 任务执行完毕之后释放线程到空闲线程队列中 persistentProxy.releaseThread(this); } else { try { synchronized(taskQueue) { taskQueue.wait(); } } catch (InterruptedException e) { } } } } }
3 .要执行的任务类:TPTask
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TPTask { private Object target; private String methodName; private Object[] params; private Class<?>[] types; public TPTask(Object target,String methodName,Object[] params,Class<?>[] types){ this.target = target; this.methodName = methodName; this.params = params; this.types = types; } public void doTask(){ try { Method method = null; if(params.length > 0) method = target.getClass().getMethod(methodName, types); else method = target.getClass().getMethod(methodName); method.invoke(target, params); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
使用:
TPTaskProxy proxy = new TPTaskProxy(); //设置线程池的大小 int poolSize = 100; proxy.setTaskPoolSize(poolSize); proxy.init(); //目标对象,可以是任何类型对象 TargetObject target = new TargetObject(); proxy.executeTask(new TPTask(target,"methodName", new Object[]{agr1, arg2,} ,new Class<?>[]{arg1.class,arg2.class}));
发表评论
-
mybatis 一些总结
2014-04-09 13:06 1324最近用mybatis开发,一些总结: 结合spring ... -
STOMP protocol
2013-12-18 00:41 1142STOMP,Streaming Text Ori ... -
java 反射机制更改私有属性 重复创建单例类对象
2012-11-04 00:16 2297单例类: package com.shenli. ... -
log4j.xml web.xml配置
2012-10-29 23:53 9902log4j.xml配置实现配置实现配置实现配置实现 先写 ... -
log4j.xml 配置
2012-10-29 23:30 998<?xml version="1.0& ... -
Maven 2 plugin fails with cannot find symbol exception when defining two locatio
2012-10-17 23:58 1220https://confluence.atlassian.co ... -
maven 1.5 编译级别
2012-09-25 10:36 848在pom.mxl中增加以下内容 <b ... -
eclipse debug 问题解决
2012-05-18 15:15 0eclipse 问题解决 问题描述:3.7.2里面安装了mav ... -
eclipse plugin update
2012-05-18 14:52 857eclipse plugin update site 总结 ... -
JVM 学习 (2)实战 OutOfMemoryError异常
2012-03-13 17:37 0首先来制造Java堆溢出: import jav ... -
JVM 学习(1)运行时数据区
2012-03-13 11:40 839今天开始学习JVM 先看看运行时数据区的结构: ... -
Ubuntu 上使用 Rxtx
2009-09-04 17:45 0ubuntu下安装和配置RXTX实现串口通讯 RXTX是一套 ... -
Ant 获取svn工程并编译
2008-08-05 12:49 3300<?xml version="1.0" ... -
Acegi配置文档
2008-08-05 12:40 1070Acegi是基于Spring的一个 ... -
java基础
2008-06-05 13:33 2354Java基础 从事java相关的编程工 ... -
JBoss Rules 2
2008-06-05 11:40 1230JBoss Rules 学习(二): RETE算法 在JBo ... -
JBoss Rules 1
2008-06-05 11:33 1645JBoss Rules 学习(一): 什么是Rule ... -
junit4参数化测试和easymock的使用
2008-06-05 11:20 3346利用junit4的一些新特性,我们可以方便的对多个参数进行测试 ... -
html编码转换工具
2008-06-04 13:07 3071对于html的特殊标记的处理,有一个好办法,可以轻松的实现ht ...
相关推荐
NULL 博文链接:https://wentry.iteye.com/blog/1873521
从易语言转型到C#感觉C#自带的线程池不够灵活(或许是自己的技术不够),所以自己写了一个线程池工作类为了配合自己的使用习惯,有兴趣的可以下载参考 代码用到的是信号处理以及队列等一些比较基础的东西,已经测试了功能...
自己写的线程池代码,win32程序,可以运行,有注释;简单易懂。
Examples 文件夹中可能包含了使用线程池的示例代码,这些示例有助于开发者理解和学习如何在自己的项目中应用线程池。通过查看这些例子,我们可以了解如何提交任务到线程池,如何等待所有任务完成,以及如何处理...
在IT领域,线程池和读写锁是两种重要的多线程编程技术,尤其是在Linux操作系统中。本项目提供了一个标准C语言实现的线程池,...开发者可以通过深入研究这些源代码,更好地理解和掌握多线程编程的精髓,提升自己的技能。
虽然VC标准库并不直接提供线程池的实现,但Windows API提供了`CreateThreadPool()`和`SubmitWorkItem()`等功能,可以用于构建线程池,但使用起来较为复杂,通常需要自己实现线程池的管理逻辑。 通过上述知识点,...
这意味着开发者可以下载这个压缩包,导入到自己的项目中,然后通过实例化和调用类的方法来创建和管理线程池,执行并发任务。 压缩包中的"VC写的一个简单的线程池"可能是源代码文件,包含了实现上述功能的类和函数。...
线程池是一种多线程处理形式,通过维护一组可重用线程来高效地执行并发任务。在"Visual C++写的线程池的例子...通过阅读和分析这些源代码,开发者可以深入理解线程池的工作机制,并将其应用到自己的项目中。
在"C++写的线程池,环境是ubuntu(Linux)"这个项目中,我们可以深入探讨以下几个核心知识点: 1. **C++线程库**:C++11及更高版本引入了`<thread>`库,提供了对多线程编程的支持。在Ubuntu这样的Linux环境中,C++...
3. **线程函数**:每个线程都有自己的执行函数,它会不断地从工作队列中取出任务进行处理。当队列为空时,线程可能会进入休眠状态,等待新任务的到来。这种机制可以避免无谓的CPU资源浪费。 4. **任务提交**:用户...
在Linux下用C写的一个简易线程池。系统是RedHat 9,gcc版本"gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)"。文件夹里的源码是按工程组织好的,在文件夹下的test目录下面有一个小的测试程序和Makefile,编译后即可...
- **线程**: 在操作系统中,线程是程序执行的最小单位,每个线程都有自己的程序计数器、系统寄存器和堆栈。 - **线程池**: 是一组预先创建并管理的线程集合,任务提交者将待处理的任务放入队列,线程池中的空闲...
在IT领域,线程池是一种优化资源管理...开发者可以通过这个项目深入理解并掌握这些技术,提高自己的编程技能。在实际开发中,这样的工具对于处理大量文件的拷贝任务尤其有用,能够提供直观的进度反馈和高效的执行策略。
瞎写的线程池原理,没啥用,只是留着自己以后想看看,在技术博客中都有.不要下载,乱七八糟的,怕你们吐槽.
自定义的线程池类,自己写的一个组件,用起来还是挺方便的。我已经用在了好几个项目上。 资源中包括一个DLL文件和一个XML文件,XML文件是方法和属性的一个注释文档,将其和DLL放置同一个目录下后,引用DLL后,使用...
使用别人的东西,始终不习惯,看别人的代码也是一头雾水,于是参考他人的功能,用 Delphi7 写了一个适合自己的线程池 。由于没有好的办法获取到 CPU 的使用率,自动调整线程数的功能就不做了。 除了常用的功能,对...
由于要写一个从第三方服务器拉取文件的插件,百度了很多都 不是很满意,所以自己写了一个,废话少说,看代码,欢迎拍板 断点续传,多线程下载文件,idea开发工具需要安装 lombok 插件,具体百度下吧, 不过没有也没...
端口转发,用线程池技术,自己写的,可以参考
在本项目"C语言+epoll+线程池实现的聊天室"中,开发者采用了一种高效并发处理模型来构建一个实时交互的聊天平台。...通过对源码的分析,我们可以深入理解epoll和线程池在实际应用中的作用,提升自己的系统编程能力。
在操作系统中,线程是程序执行的最小单位,每个线程都有自己独立的运行栈,共享进程的内存空间。创建多线程可以使得程序并行处理多个任务,比如在用户界面更新的同时进行后台计算。然而,多线程也带来了同步和竞态...