`
micheal19840929
  • 浏览: 161724 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

任务型队列式多线程之实现

    博客分类:
  • J2EE
阅读更多

      前言:最近做的一个项目正好要用到多线程,而且要实现队列式处理,即外界可向线程添加任务,同时一旦队列中有任务时,线程自动启动对之进行处理。要求任务的添加与执行要同步处理。最终结果如下:

[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();

}

 

以上代码都已经过测试,呵呵,一个简单的线程雏形,希望对初学者有所帮助,算是抛砖引玉吧。

0
0
分享到:
评论

相关推荐

    C#多线程处理多个队列数据的方法

    本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; ...

    基于Qt的多线程流水线异步服务器稳定版

    数据库被作为资源管理,支持在多线程的条件下,使用数据库资源。 5、 框架界面。尽管常见的服务运行时表现为一个后台进程,但为了更好的演示服务器的功能,避免繁琐的配置,还是需要一个图形界面来显示状态、设置...

    基于C#的游戏服务器后台.zip

    多线程/异步编程: C#提供了丰富的并发编程模型,如Task、async/await关键字以及ThreadPool,用于处理并发客户端连接、非阻塞I/O操作和后台任务。这有助于提高服务器的响应速度和吞吐能力。 网络通信: 使用诸如...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果让你设计一个动态大小的线程池,如何设计,应该有哪些方法? 87 【多线程】...

    超级线程池模块

    稳定的线程池,可解决很多易语言程序多线程不稳定,容易失去响应的问题 支持随时改变线程数,线程处理函数指针,暂停线程 ------------------------------ .版本 2 .程序集 线程池, , 公开 .子程序 创建, 逻辑型,...

    PySiQ:适用于您的应用程序的Python Simple Queue系统

    相反,通过将任务添加到队列中来安排任务,它们将等待直到最终一个worker (即在单独线程中运行的特殊进程)将其从队列中移出并执行作业。 对于无法在较短的HTTP请求窗口期间处理繁重任务的Web应用程序,此概念尤其...

    VC与Labview、Matlab编程论文资料[2].rar

    VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...

    VC与Labview、Matlab编程论文资料

    VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...

    VC与Labview、Matlab编程论文资料[4].rar

    VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和Excel对象接口的研究与应用.pdf VC_和Matlab混合...

    UNIX操作系统教程 张红光

    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连续内存分配方式...

    Fourinone分布式并行计算四合一框架

     首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容...

    基于DOS的多任务系统

    /*最大线程数 , 阻塞队列头指针*/ struct int_regs /*现场信息的保存格式布置堆栈*/{unsigned bp, di, si, ds, es, dx, cx, bx, ax, ip, cs, flags;}; typedef struct{ /*记录型信号量*/int value;struct TCB *wq;...

    arnold对彩色图像解密方法matlab实现代码-OpenCue:您可以部署视觉效果和动画制作的渲染管理系统

    支持Katana,Prman和Arnold的本机多线程。 支持多设施,预置型,云和混合部署。 您可以将主机拆分为大量的主机,每个主机都有自己的保留核心和内存要求。 集成的自动预订。 作业数量没有限制。 学到更多 有关安装,...

    API之网络函数---整理网络函数及功能

    API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Fourinone分布式计算框架

    首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容...

    C++网络爬虫项目

    空间,比如将“网页下载”以多线索(进程或线程)并发的方式实现,甚至将 “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...

    .NET 分布式组件库 Exceptionless Foundatio.zip

    目录Foundatio 介绍Getting Started缓存队列锁消息工作任务文件存储度量日志示例程序源码总结Foundatio 介绍GitHub : https://github.com/exceptionless/FoundatioFoundatio 是一个插件式的,松耦合的一套构建分布式...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics