`
micheal19840929
  • 浏览: 163158 次
  • 性别: 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
分享到:
评论

相关推荐

    workquere工作队列 多线程

    工作队列(Work Queue)是一种在多线程编程中广泛使用的模式,用于协调并发任务的执行,优化系统资源的利用并提高程序的响应速度。在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务...

    多线程队列

    本文将深入探讨如何在C语言中实现多线程队列及其相关的知识点。 首先,多线程是指在一个进程中创建多个执行线程,每个线程可以并发执行不同的任务。这样可以充分利用多核处理器的计算能力,提高程序的运行效率。在...

    多线程使用消息队列

    多线程使得一个程序能够同时执行多个任务,而消息队列则是实现进程间通信(IPC)的有效方式,尤其在分布式系统中广泛应用。下面我们将深入探讨这两个概念以及它们之间的交互。 **多线程** 多线程是指在一个进程中...

    消息队列多线程处理日志

    多线程技术能够充分利用多核处理器的计算能力,提高程序的并行处理能力,尤其在处理I/O密集型任务时,如读写日志,能够显著提升效率。但是,多线程也会带来线程安全问题,如数据竞争和死锁,因此需要通过锁、信号量...

    多线程进度条(真正的多线程实现)

    在IT领域,多线程是一种常见的编程技术,用于在单个程序中同时执行多个任务,以提高效率和响应性。特别是在处理大型数据或执行长时间运算时,多线程可以提供更好的用户体验,例如显示实时更新的进度条。在这个场景中...

    python多线程编程实现网络串口透传

    在Python多线程编程中,需要注意GIL(全局解释器锁)的存在,虽然Python的多线程在CPU密集型任务上可能表现不佳,但在I/O密集型任务(如网络和串口通信)中,由于线程间等待I/O的时间较长,多线程仍能有效提高程序...

    多线程并发处理的简单实现

    通过多线程,程序可以在等待I/O操作或计算密集型任务之间切换,减少CPU的空闲时间,提高整体性能。 描述中的“使用队列做缓冲池”指的是使用一种叫做任务队列的数据结构。任务队列通常是一个先进先出(FIFO)的数据...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    python 多线程实现多个网址的多次快速访问

    在Python编程中,多线程是一种并发执行任务的机制,尤其在处理I/O密集型任务如网络请求时,能够显著提高程序效率。本教程将详细讲解如何使用Python的多线程来实现对多个网址的快速访问,并记录访问结果。 首先,...

    线程池&&队列各类区别使用场景

    在多线程环境下,队列常用于线程间的通信和任务调度。队列的种类繁多,例如: - **阻塞队列(BlockingQueue)**:当队列满时,添加操作会阻塞,空时,移除操作会阻塞。适合线程池的Task Queue。 - **并发队列...

    简单多线程多任务的学习

    这篇教程主要面向初学者,旨在帮助他们理解并掌握如何在程序中实现多线程和多任务,以及如何使用进度条来跟踪任务执行的进度。 首先,我们要理解什么是多线程。在单线程程序中,代码按照顺序执行,一次只能做一件...

    多线程的 压缩与解压

    在IT行业中,多线程技术是一项关键的编程概念,它允许多个任务同时执行,以提高应用程序的效率和响应速度。特别是在处理大文件的压缩和解压操作时,多线程能够显著提升性能,因为这样的操作通常需要大量的计算资源。...

    iOS多线程Demo

    - 计算密集型任务:如图片处理、加密解密等,利用多线程分散CPU负载。 为了保证用户界面的响应性,iOS强调所有的UI更新必须在主线程中进行,这被称为“主线程原则”。在“iOS多线程Demo”中,可能会包含如何在后台...

    多线程游戏坦克大战

    《多线程游戏坦克大战》是一款利用多线程技术实现的竞技类游戏,它通过并发执行不同的游戏逻辑,为玩家提供了流畅且实时的互动体验。本文将深入探讨这款游戏中的核心知识点,包括多线程原理、游戏逻辑设计以及相关...

    多线程实战应用

    在IT行业中,多线程是实现并发执行任务的关键技术,特别是在服务器端开发、实时系统以及高性能计算等领域。本文将深入探讨“多线程实战应用”这一主题,结合提供的标签“源码”和“工具”,我们将从理论基础到实践...

    C++ windows版 多生产者多消费者的队列实现

    在多线程环境中,生产者和消费者可能同时运行,因此需要一种机制来确保数据的一致性和完整性,避免数据竞争问题。 在C++中,我们可以利用Windows API中的`CreateSemaphore`函数创建信号量来实现线程同步。信号量...

    java多线程实现生产者和消费者

    在Java编程中,多线程是一种重要的技术,它允许程序同时执行多个任务,提升系统效率。在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)...

    多线程编程例子

    多线程可以有效地将这些IO密集型任务与CPU密集型任务(如解码)分离,提高程序的并发性能。 在Linux中,多线程编程还需要关注线程安全问题,如避免全局变量的不安全访问,合理管理资源分配和释放,以及正确处理异常...

    C#多线程执行

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地利用多核处理器资源,提高程序的运行效率。本篇文章将深入探讨C#中的多线程执行...

    多线程GDI程序

    多线程的使用通常是为了提高性能,尤其是在处理密集型计算或I/O操作时。在图形绘制的场景下,如果在一个线程中完成所有的绘制工作,可能会导致UI冻结,影响用户体验。因此,将绘图任务分散到多个线程可以帮助避免...

Global site tag (gtag.js) - Google Analytics