`
SpaceCity
  • 浏览: 99114 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多线程实例片段

阅读更多
/**
*
*
* 下面是部分code, 全部code 见附件
*
*/
package com.task;

/**
* 线程模板 实现线程的暂停和恢复
*
* 全部code 见附件
*
*/
public abstract class TemplateThread implements Runnable {
/**
* 线程状态 默认是false,即允许状态
*/
private boolean pause;

@Override
public void run() {
try {
while (!Thread.interrupted()) {
work();

// 检测当前线程是否暂停
synchronized (this) {
if (pause) {
this.wait();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* 暂停
*/
public synchronized void pause() {
pause = true;
}

/**
* 恢复
*/
public synchronized void resume() {
pause = false;
this.notifyAll();
}

/**
* @return 当前状态
*/
public boolean isPause() {
return pause;
}

/**
* 线程工作内容
*
* @throws InterruptedException
*/
public abstract void work() throws InterruptedException;

}


package com.task;

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;

/**
* 管理任务收集器和处理器
*
*
*
*/
public class TaskManager extends TemplateThread {
// task queue
private BlockingQueue<Task> taskQueue;
// gatherer
private TaskGather gatherer;
// worker
private PriorityQueue<TaskHandler> workers;
private Queue<TaskHandler> noWorkers;
// executor
private ExecutorService executor;

public TaskManager(int maxTaskSize, ExecutorService executor) {
this.taskQueue = new ArrayBlockingQueue<Task>(maxTaskSize);
this.workers = new PriorityQueue<TaskHandler>(100);
this.noWorkers = new LinkedList<TaskHandler>();

this.gatherer = new TaskGather(taskQueue);

this.executor = executor;

addGenerator();
addHandler();
}

@Override
public void work() throws InterruptedException {
TimeUnit.SECONDS.sleep(10);
adjustHandlers();
printNoWorker();
}

private void adjustHandlers() throws InterruptedException {
if (taskQueue.size() > 0) {
if (0 == workers.size() || taskQueue.size() / workers.size() < 1) {
addHandler();
}
if (taskQueue.size() / workers.size() >= 1
&& taskQueue.size() / workers.size() < 2) {
TaskHandler taskHandler = noWorkers.poll();
if (null == taskHandler) {
addHandler();
} else {
taskHandler.resume();
workers.offer(taskHandler);
}
}// hire a new handler
else if (taskQueue.size() / workers.size() >= 2) {
addHandler();
} else {
TaskHandler taskHandler = workers.poll();
if (null != taskHandler) {

taskHandler.pause();
noWorkers.offer(taskHandler);
}
}
} else {
TaskHandler taskHandler = null;
while (null != (taskHandler = workers.poll())) {
taskHandler.pause();
noWorkers.offer(taskHandler);

}
}

if (gatherer.getCount() > 100) {
gatherer.pause();
}
}

private void addGenerator() {
executor.execute(gatherer);
}

private void addHandler() {
TaskHandler taskHandler = new TaskHandler(taskQueue);
executor.execute(taskHandler);
workers.offer(taskHandler);

}

private void printNoWorker() {
System.out
.println("====================================================");
for (TaskHandler taskHandler : noWorkers) {
System.out.println("manager" + taskHandler);
}
System.out
.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}
分享到:
评论

相关推荐

    Arduino 使用多线程例子

    标题中的“Arduino 使用多线程例子”意味着我们将探讨如何在Arduino平台上实现多任务并行处理。通常,Arduino基于单片机,不直接支持操作系统或内置的多线程机制。但是,通过巧妙编程和使用库,我们可以模拟多线程的...

    VB多线程实例 - VBThread2

    VBThread2是一个专门用于VB多线程操作的实例,它帮助开发者突破VB6原生环境对多线程支持的局限性,实现更高效能的应用程序。 在VB6中,由于其内建的线程模型并不像现代.NET框架那样强大,开发者需要依赖第三方库或...

    Qt UDP QUdpSocket多线程实例 movetothread

    在"Qt UDP QUdpSocket多线程实例 movetothread"的场景中,我们将探讨如何将`QUdpSocket`操作放到单独的线程中,以避免阻塞主线程并提高系统效率。 首先,理解UDP和TCP的区别是重要的。TCP是一种面向连接的协议,...

    java 多线程实例

    ### Java多线程实例 在Java中,多线程是实现并发执行的一种方式,它允许同时运行多个线程来执行不同的任务或同一任务的不同部分。Java多线程的核心类库主要包含在`java.lang.Thread`和`java.util.concurrent`包中。...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    vb多线程文档

    通过提供的代码片段,我们可以看到VB多线程实现的具体细节。例如,`EnumThreadWndMain`函数用于枚举线程窗口,`FindWindow`函数用于查找指定类名和窗口名的窗口,而`GetWindowThreadProcessId`函数则用于获取窗口...

    socket多线程文件上传下载实例

    本实例将探讨如何结合Socket和多线程技术来实现文件的高效上传和下载。 首先,我们需要理解Socket的基本概念。Socket是应用层与传输层的接口,允许应用程序通过TCP/IP协议进行通信。在Java中,`java.net.Socket`类...

    多线程读取文件

    在IT领域,多线程是并发处理任务的关键技术,尤其在读取大文件时,能够显著提高程序的执行效率。本文将围绕“多线程读取文件”这一主题,结合给定的标签“源码”和“工具”,深入探讨如何在Java等编程语言中实现这一...

    SpringBoot版本的多线程下载文件,分段下载文件

    本篇将深入探讨如何利用SpringBoot实现多线程下载文件以及分段下载文件的技术。 首先,多线程下载文件是一种提高下载速度的方法,通过将大文件分成多个小部分,每个部分由一个单独的线程负责下载,从而充分利用多核...

    多线程控制

    在给出的代码片段中,作者通过一个具体的例子展示了如何在按键精灵中使用多线程来实现一些基本的操作。接下来,我们将对这段代码进行详细分析: 1. **线程声明与启动**: ```autoit // 一号 Dim EnvIDA,IDB,IDC ...

    c# 多线程任务中结束全部线程

    在给定的代码片段中,虽然存在一些乱码字符,但我们可以从中抽取出与多线程相关的知识点,包括如何创建线程、使用委托进行跨线程调用以及如何优雅地关闭线程。 ### 创建线程 在C#中,`System.Threading.Thread`类...

    多线程udp通信

    以下是一个简单的多线程UDP通信示例代码片段: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Threading; class UdpCommunicator { private UdpClient udpClient; private...

    python 实现多线程下载m3u8格式视频并使用fmmpeg合并

    3. **多线程下载**:利用Python的`threading`模块创建多个线程,每个线程从任务队列中取出一个TS片段的URL进行下载。为了保证TS文件的顺序,我们预先在文件中写入了每个TS文件的名称,这在后续的合并过程中非常重要...

    android——多线程

    这个文件可能包含了创建Handler、Looper的初始化、发送和处理Message的代码片段,或者是一些辅助类和接口,用于简化多线程编程。 总之,理解并熟练运用Handler进行多线程编程是Android开发中必不可少的技能。通过...

    多线程线程池实例及相关资料

    了解了基本概念后,深入学习提供的"多线程及线程池"压缩包,你将能够找到更多关于VC++环境下的多线程编程和线程池实现的具体示例,包括代码片段、调试技巧以及可能遇到的问题及其解决方案。这些实例将有助于你更好地...

    C#多线程开发实例教程

    ### C#多线程开发实例教程精解 #### 概述与核心概念 C#作为一门功能丰富的现代编程语言,其内置的多线程支持使得开发者能够构建高性能、响应迅速的应用程序。多线程允许程序中的多个任务同时执行,极大地提高了...

    官方例子air与fp版 air的桌面应用里可以有多线程(转)

    标题中的“官方例子air与fp版 air的桌面应用里可以有多线程(转)”指出,这个内容主要涉及Adobe AIR技术,特别是针对桌面应用的多线程实现。Adobe AIR(Adobe Integrated Runtime)允许开发者创建跨平台的桌面应用...

    火车票售票系统 创建多线程

    本文将基于给定的代码片段,详细介绍如何在一个简单的火车票售票系统中实现多线程。 #### 1. 多线程简介 多线程是指从软件或者硬件上实现多个线程并发执行的技术。程序执行时,进程可以创建多个线程,这些线程共享...

    C# socket多线程编程

    这个实例中,多线程机制使得服务器能同时处理多个客户端的连接,增强了系统的并发能力。 以下是一个简化版的服务器端代码片段: ```csharp private void StartListening() { listener = new TcpListener(listen...

Global site tag (gtag.js) - Google Analytics