前言:最近做的一个项目正好要用到多线程,而且要实现队列式处理,即外界可向线程添加任务,同时一旦队列中有任务时,线程自动启动对之进行处理。要求任务的添加与执行要同步处理。最终结果如下:
[TaskThread.java]
import java.util.HashMap;
import java.util.Vector;
/**
* Task Processing Thread.It is enable to add Task and perform task synchronously.
* All tasks is restored in the task queue.
* If there is task(s) in the task queue,it(them) will be performed by the thread automaticlly.
* Or the thread will be turned into waiting for waking.
* <br>
* Mode:Multiton Mode
* <br>
* 任务处理线程,实现同步添加及执行任务,任务保存在任务队列之中.
* 当任务队列中存在任务时,线程将自动对其进行处理;否则线程进入等待状态.
* <br>
* 模式:多例模式
* @author Micheal Hong
* @email babala_234@163.com
* @see Task
*/
public class TaskThread extends Thread{
private static HashMap<String,TaskThread> instanceMap=new HashMap<String,TaskThread>();
private Vector<Task> taskQueue=new Vector<Task>();
private boolean runnable=true;
/**
* Return a task thread instance corresponding to threadId,
* if it don't exist,create one and return it.
* Note that each <code>threadId</code> is unique to the others.
* <br>
* 返回一个与threadId对应的任务处理线程实例,如果不存在这样的实例,
* 则进行创建并返回一个新实例,新实例与threadId相对应
* @param threadId
* @return
*/
public static TaskThread getInstance(String threadId)
{
if(instanceMap.containsKey(threadId)==false)
{
instanceMap.put(threadId,new TaskThread());
}
return instanceMap.get(threadId);
}
private TaskThread()
{}
@Override
public void run() {
Task task;
while(runnable)
{
synchronized (taskQueue) { //apply for the task queue's obj lock
while(taskQueue.isEmpty())
{
taskQueue.notify(); //release the task queue's obj lock
try {
taskQueue.wait(); //turn into waiting for being waken
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*when the task queue is not empty*/
task=taskQueue.remove(0); //fetch the head task
taskQueue.notify(); //release the task queue's obj lock
}
task.perform(); //perform the task
}
}
/**
* Add task into task queue synchronously and then wake the task thread.
* <br>
* 向任务队列添加任务并唤醒线程对队列进行处理
* @param task
*/
public void addTask(Task task)
{
synchronized (taskQueue) { //apply for the task queue's obj lock
taskQueue.add(task);
taskQueue.notify(); //release the task queue's obj lock
}
}
}
[Task.java]
**
* Task Entry
* 任务实体
* Mode:Template Mode
* 模式:模板模式
* @author Micheal Hong
*
*/
public abstract class Task {
protected String projectId;
public Task(String projectId)
{
this.projectId=projectId;
}
public String getProjectId() {
return projectId;
}
/**
* task performance.It is an interface supplied for implemented by caller.
* 任务的执行。由调用者自行实现。
* @see TaskThread
*/
public abstract void perform();
}
以上代码都已经过测试,呵呵,一个简单的线程雏形,希望对初学者有所帮助,算是抛砖引玉吧。
分享到:
相关推荐
本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; ...
数据库被作为资源管理,支持在多线程的条件下,使用数据库资源。 5、 框架界面。尽管常见的服务运行时表现为一个后台进程,但为了更好的演示服务器的功能,避免繁琐的配置,还是需要一个图形界面来显示状态、设置...
多线程/异步编程: C#提供了丰富的并发编程模型,如Task、async/await关键字以及ThreadPool,用于处理并发客户端连接、非阻塞I/O操作和后台任务。这有助于提高服务器的响应速度和吞吐能力。 网络通信: 使用诸如...
【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果让你设计一个动态大小的线程池,如何设计,应该有哪些方法? 87 【多线程】...
稳定的线程池,可解决很多易语言程序多线程不稳定,容易失去响应的问题 支持随时改变线程数,线程处理函数指针,暂停线程 ------------------------------ .版本 2 .程序集 线程池, , 公开 .子程序 创建, 逻辑型,...
相反,通过将任务添加到队列中来安排任务,它们将等待直到最终一个worker (即在单独线程中运行的特殊进程)将其从队列中移出并执行作业。 对于无法在较短的HTTP请求窗口期间处理繁重任务的Web应用程序,此概念尤其...
VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...
VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...
VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...
2.1.2用户的注册与注销11 2.1.3账户的管理12 2.1.4用户口令的管理12 2.1.5...任务178 9.2地址重定位179 9.2.1逻辑地址空间179 9.2.2物理地址空间179 9.2.3地址重定位180 9.3常用存储管理技术181 9.3.1连续内存分配方式...
首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容...
/*最大线程数 , 阻塞队列头指针*/ struct int_regs /*现场信息的保存格式布置堆栈*/{unsigned bp, di, si, ds, es, dx, cx, bx, ax, ip, cs, flags;}; typedef struct{ /*记录型信号量*/int value;struct TCB *wq;...
支持Katana,Prman和Arnold的本机多线程。 支持多设施,预置型,云和混合部署。 您可以将主机拆分为大量的主机,每个主机都有自己的保留核心和内存要求。 集成的自动预订。 作业数量没有限制。 学到更多 有关安装,...
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容...
空间,比如将“网页下载”以多线索(进程或线程)并发的方式实现,甚至将 “DNS解析”也处理为并发的过程,以避免爬虫系统的I/O吞吐率受到网站服 务器和域名解析服务器的限制。而对于“已抓取URL队列”则可以采用...
1 交易型系统设计的一些原则 2 1.1 高并发原则 3 1.1.1 无状态 3 1.1.2 拆分 3 1.1.3 服务化 4 1.1.4 消息队列 4 1.1.5 数据异构 6 1.1.6 缓存银弹 7 1.1.7 并发化 9 1.2 高可用原则 10 1.2.1 降级 10 1.2.2 限流 11...
目录Foundatio 介绍Getting Started缓存队列锁消息工作任务文件存储度量日志示例程序源码总结Foundatio 介绍GitHub : https://github.com/exceptionless/FoundatioFoundatio 是一个插件式的,松耦合的一套构建分布式...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...