`
jianfulove
  • 浏览: 120017 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
社区版块
存档分类
最新评论

多线程处理耗时任务的封装方式

阅读更多

 

工作中用到的处理多任务的多线程实现,以下仅为简略书写以便备忘、

 

package need.most.time.producer;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import need.most.time.ProcessorWorkerThread;

public class ProcessingThreadsDispatcher {
	protected int maxQueueSize = new Long(Runtime.getRuntime().maxMemory() / 400000L).intValue();
	int def_pool_size = 100;
	private String defPluginsThreadsPool = "default-threads-pool";
     //这里用一个map来封装,也就是可能有多种处理耗时任务的processor处理器,每一个处理器对应一个处理线程沲也就最合理
	private Map<String, ProcessingThreads<ProcessorWorkerThread>> workerThreads = new ConcurrentHashMap<String, ProcessingThreads<ProcessorWorkerThread>>(32);
	
	ProcessorWorkerThread worker;
	ProcessingThreads<ProcessorWorkerThread> pt;
	{
		worker = new ProcessorWorkerThread();
		pt = new ProcessingThreads<ProcessorWorkerThread>(worker, def_pool_size, maxQueueSize, defPluginsThreadsPool);
		workerThreads.put(defPluginsThreadsPool, pt);
	}
	
	
	//主要的方法入口
	private void walk(final Object arg) {
		//processor 为处理器,专处理耗时任务
		Object processor = new Object();
        String processorId=defPluginsThreadsPool;//应该每一个processor都提供一个唯一的name,这样就可以得到相对应processor
		ProcessingThreads<ProcessorWorkerThread> pt = workerThreads.get(processorId);

		if (pt == null) {
			pt = workerThreads.get(defPluginsThreadsPool);
		}
		if (pt.addItem(processor,arg)) {
			//记录哪个处理器处理的哪个对象等
		}
		
	}
}

 

 

 

package need.most.time;

// 通用的处理器实现
public class ProcessorWorkerThread extends WorkerThread {

	//一般这里就会执行真实代表的处理器实现方法
	@Override
	public void process(QueueItem item) {
		
		Object processor=item.getProcessor();
		Object arg=item.getArg();
		//processor拿着arg对象进行处理耗时任务。
		//processor.process(...)
		System.out.println("do finish");
	}

	@Override
	public WorkerThread getNewInstance() {
		ProcessorWorkerThread worker = new ProcessorWorkerThread();
		return worker;
	}

}

 

 

package need.most.time;

import java.util.concurrent.LinkedBlockingQueue;
//线程处理抽象类
public abstract class WorkerThread extends Thread {

	private LinkedBlockingQueue<QueueItem> queue = null;
	private boolean stopped = false;

	public abstract void process(QueueItem item);
	public abstract WorkerThread getNewInstance();
	public boolean offer(QueueItem item) {
		return queue.offer(item);
	}
	
	public void setQueueMaxSize(int maxSize) {
		LinkedBlockingQueue<QueueItem> oldQueue = queue;

		queue = new LinkedBlockingQueue<QueueItem>(maxSize);

		if (oldQueue != null) {
			queue.addAll(oldQueue);
		}
	}

	@Override
	public void run() {
		QueueItem item = null;

		while (!stopped) {
			try {
				item = queue.take();

				long start = System.currentTimeMillis();

				process(item);

				long end = System.currentTimeMillis() - start;
				System.out.println("do time=" + (end - start) + "ms");
			} catch (Exception e) {
			}

		}

	}
	
	
	

}

 

 

 

 

package need.most.time.producer;

import java.util.ArrayList;

import need.most.time.QueueItem;
import need.most.time.WorkerThread;
//处理线程沲类,些类维护多条处理线程
public class ProcessingThreads<E extends WorkerThread> {
	private int numWorkerThreads = 1;
	private ArrayList<E> workerThreads = null;
	private String name = null;

	public ProcessingThreads(E worker, int numWorkerThreads, int maxQueueSize, String name) {
		this.numWorkerThreads = numWorkerThreads;
		this.workerThreads = new ArrayList<E>(numWorkerThreads);
		this.name = name;
		// 生成指定数量的工作线程
		for (int j = 0; j < numWorkerThreads; j++) {
			WorkerThread t = worker.getNewInstance();

			t.setQueueMaxSize(maxQueueSize);
			t.setDaemon(true);
			t.setName(name + " Queue Worker " + j);
			t.start();
			workerThreads.add((E) t);
		}
	}

	public boolean addItem(Object processor, Object arg) {
		boolean ret = false;
		QueueItem item = new QueueItem(processor, arg);
		//这里应该指定哪一个用户他的唯一标识,这样可以每次处理同一个用户都是由同一个线程来执行
		ret = workerThreads.get(Math.abs(processor.hashCode()) % numWorkerThreads).offer(item);
		return ret;
	}

}

 

 

 

 

 

 

package need.most.time;
//封装一些处理参数bean
public class QueueItem {
	private Object arg;
	private Object processor;
	public QueueItem(Object arg, Object processor) {
		super();
		this.arg = arg;
		this.processor = processor;
	}
	public Object getArg() {
		return arg;
	}
	public void setArg(Object arg) {
		this.arg = arg;
	}
	public Object getProcessor() {
		return processor;
	}
	public void setProcessor(Object processor) {
		this.processor = processor;
	}
	

}

 

 

分享到:
评论

相关推荐

    Qt 之多线程处理多任务

    在Qt框架中,多线程处理多任务是提高应用程序性能和响应能力的重要手段。Qt提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...

    多线程md5封装类,用事件通知完成,可直接用于界面中

    总的来说,"多线程MD5封装类"是将并发处理和数据安全技术相结合的一个实用工具,它利用多线程提高计算效率,通过事件通知保持界面的实时更新,是现代软件开发中的一个重要实践。对于理解和使用此类库的开发者来说,...

    spring boot注解事务+多线程

    在Spring Boot应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...

    海康网络相机利用SDK 多线程读取图像程序

    3. **多线程编程**:在C++中,多线程技术能提高程序的执行效率,尤其在处理图像这样实时性要求高的任务时。本程序可能创建了多个线程,每个线程独立地从相机读取图像,以减少因单一线程处理导致的延迟。 4. **图像...

    Asp.net 进度条封装(多线程)控件+示例

    本文将深入探讨如何封装一个基于多线程的Asp.net进度条控件,并提供实际应用示例。 首先,我们要理解多线程的概念。在Asp.net中,多线程是指在一个应用程序中同时运行多个独立的任务或操作。通过使用多线程,我们...

    12.1 Qt5多线程:多线程及简单实例

    Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作而变得卡顿。本知识点将深入探讨Qt5中的多线程以及一个简单的实例——WorkThread。 **1. ...

    .NET多线程实例

    在控制台应用中,多线程可以用于执行耗时的任务,而不阻塞主线程。而在WinForm应用中,多线程常用于后台任务,如数据加载或计算,同时保持用户界面的响应性。需要注意的是,WinForm中的UI更新必须在主线程(UI线程)...

    Android多线程处理[参考].pdf

    为了解决这个问题,Android引入了多线程技术,允许开发者在子线程中执行这些耗时操作,而将UI更新的任务交还给主线程。 1. 子线程更新UI 子线程不能直接修改UI组件,因为这违反了Android的单线程模型。若试图在子...

    MFC多线程编程

    多线程可以实现任务的并行处理,提高CPU资源利用率。然而,由于大多数计算机为单核CPU,线程实际上是通过时间片轮转的方式交替执行,看起来是并行的。过多的线程竞争CPU可能导致频繁的线程切换,反而降低系统性能。 ...

    多线程编程(完整版)

    多线程编程是一种重要的软件开发技术,特别是在处理并发任务、优化资源利用率和提高程序响应速度方面。通过创建多个线程,程序可以在同一进程中并行执行不同的任务,从而提高整体效率。 在操作系统层面,进程和线程...

    Android多线程及异步处理问题详细探讨

    在Android开发中,多线程和异步处理是至关重要的技术,它们主要用于改善用户体验...开发者需要根据任务的特性选择合适的多线程实现方式,并熟练掌握Handler/Looper/Message机制,以便在不同线程间高效地协调任务执行。

    QT多线程—主界面卡死解决方案

    QT框架提供了强大的多线程支持,让我们可以方便地将耗时任务转移到后台线程,以保持主线程的响应性,从而提高用户体验。 QT中的多线程主要涉及到QThread类和Qt的信号与槽机制。QThread类是QT对标准C++线程的封装,...

    untiy 多线程demo

    5. **多线程应用**:在Unity中,多线程通常用于执行非图形相关的耗时任务,如数据解析、物理计算、网络通信等。正确使用多线程可以显著提升游戏性能,但同时也需要处理好线程间的同步和通信问题,避免竞态条件和死锁...

    Android多线程处理 详解

    ### Android多线程处理详解 #### 一、Android进程与线程基础 在深入探讨Android中的多线程处理之前,我们需要先理解Android的基本进程和线程模型。 **Android进程:** 当一个Android应用首次启动时,系统会为该...

    安卓多线程多任务下载

    在安卓平台上,实现多线程、多任务下载是一项常见的需求,尤其对于大型文件或网络资源,这种方式能显著提高下载效率并优化用户体验。本教程将详细解释如何在Android中实现这样的功能,并解决文档注释乱码问题。 ...

    Qt多线程测试代码

    标题"Qt多线程测试代码"暗示了我们将探讨如何在Qt中使用多线程来执行耗时任务,以避免阻塞主线程导致用户界面(UI)无响应。在实际的软件开发中,这通常是提高用户体验的关键策略之一。 描述中提到,"Qt多线程多用于...

    WinForm自定义多线程

    在Windows Forms(WinForm)应用开发中,多线程技术是一项关键技能,它允许应用程序同时执行多个任务,提高程序响应速度并优化资源管理。本文将深入探讨如何在WinForm应用中自定义多线程,以实现高效且用户友好的...

    C#多线程与UI响应

    C#多线程与UI响应是应用程序设计中的一种重要技术,需要注意避免在UI线程中执行耗时的任务,使用委托调用Form的方法来实现界面更新,并选择合适的多线程编程方式,以提高应用程序的响应速度和用户体验。

    MFC多线程的创建,包括工作线程和用户界面线程

    通过多线程技术,可以在同一进程内实现任务的并行处理,提高程序的运行效率和响应速度。 ##### 2.2 MFC多线程实现 MFC支持两种类型的线程:**用户界面线程**和**工作者线程**。其中: - **用户界面线程**(UI ...

Global site tag (gtag.js) - Google Analytics