工作中用到的处理多任务的多线程实现,以下仅为简略书写以便备忘、
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提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...
总的来说,"多线程MD5封装类"是将并发处理和数据安全技术相结合的一个实用工具,它利用多线程提高计算效率,通过事件通知保持界面的实时更新,是现代软件开发中的一个重要实践。对于理解和使用此类库的开发者来说,...
在Spring Boot应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...
3. **多线程编程**:在C++中,多线程技术能提高程序的执行效率,尤其在处理图像这样实时性要求高的任务时。本程序可能创建了多个线程,每个线程独立地从相机读取图像,以减少因单一线程处理导致的延迟。 4. **图像...
本文将深入探讨如何封装一个基于多线程的Asp.net进度条控件,并提供实际应用示例。 首先,我们要理解多线程的概念。在Asp.net中,多线程是指在一个应用程序中同时运行多个独立的任务或操作。通过使用多线程,我们...
Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作而变得卡顿。本知识点将深入探讨Qt5中的多线程以及一个简单的实例——WorkThread。 **1. ...
在控制台应用中,多线程可以用于执行耗时的任务,而不阻塞主线程。而在WinForm应用中,多线程常用于后台任务,如数据加载或计算,同时保持用户界面的响应性。需要注意的是,WinForm中的UI更新必须在主线程(UI线程)...
为了解决这个问题,Android引入了多线程技术,允许开发者在子线程中执行这些耗时操作,而将UI更新的任务交还给主线程。 1. 子线程更新UI 子线程不能直接修改UI组件,因为这违反了Android的单线程模型。若试图在子...
多线程可以实现任务的并行处理,提高CPU资源利用率。然而,由于大多数计算机为单核CPU,线程实际上是通过时间片轮转的方式交替执行,看起来是并行的。过多的线程竞争CPU可能导致频繁的线程切换,反而降低系统性能。 ...
多线程编程是一种重要的软件开发技术,特别是在处理并发任务、优化资源利用率和提高程序响应速度方面。通过创建多个线程,程序可以在同一进程中并行执行不同的任务,从而提高整体效率。 在操作系统层面,进程和线程...
在Android开发中,多线程和异步处理是至关重要的技术,它们主要用于改善用户体验...开发者需要根据任务的特性选择合适的多线程实现方式,并熟练掌握Handler/Looper/Message机制,以便在不同线程间高效地协调任务执行。
QT框架提供了强大的多线程支持,让我们可以方便地将耗时任务转移到后台线程,以保持主线程的响应性,从而提高用户体验。 QT中的多线程主要涉及到QThread类和Qt的信号与槽机制。QThread类是QT对标准C++线程的封装,...
5. **多线程应用**:在Unity中,多线程通常用于执行非图形相关的耗时任务,如数据解析、物理计算、网络通信等。正确使用多线程可以显著提升游戏性能,但同时也需要处理好线程间的同步和通信问题,避免竞态条件和死锁...
### Android多线程处理详解 #### 一、Android进程与线程基础 在深入探讨Android中的多线程处理之前,我们需要先理解Android的基本进程和线程模型。 **Android进程:** 当一个Android应用首次启动时,系统会为该...
在安卓平台上,实现多线程、多任务下载是一项常见的需求,尤其对于大型文件或网络资源,这种方式能显著提高下载效率并优化用户体验。本教程将详细解释如何在Android中实现这样的功能,并解决文档注释乱码问题。 ...
标题"Qt多线程测试代码"暗示了我们将探讨如何在Qt中使用多线程来执行耗时任务,以避免阻塞主线程导致用户界面(UI)无响应。在实际的软件开发中,这通常是提高用户体验的关键策略之一。 描述中提到,"Qt多线程多用于...
在Windows Forms(WinForm)应用开发中,多线程技术是一项关键技能,它允许应用程序同时执行多个任务,提高程序响应速度并优化资源管理。本文将深入探讨如何在WinForm应用中自定义多线程,以实现高效且用户友好的...
C#多线程与UI响应是应用程序设计中的一种重要技术,需要注意避免在UI线程中执行耗时的任务,使用委托调用Form的方法来实现界面更新,并选择合适的多线程编程方式,以提高应用程序的响应速度和用户体验。
通过多线程技术,可以在同一进程内实现任务的并行处理,提高程序的运行效率和响应速度。 ##### 2.2 MFC多线程实现 MFC支持两种类型的线程:**用户界面线程**和**工作者线程**。其中: - **用户界面线程**(UI ...