`
SpaceCity
  • 浏览: 97818 次
  • 性别: 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("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}
分享到:
评论

相关推荐

    Python多线程原理与用法详解

    本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下: 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一...

    Mandelbrot:一个C ++ OpenGL程序,它使用几种方法(单线程,通过std的多线程)可视化Mandelbrot分形

    一个C ++ / OpenGL程序,它使用几种方法(单线程,通过std :: thread的多线程,通过OpenMP的多线程,OpenGL着色器)可视化Mandelbrot分形。 要求 GLEW: ://glew.sourceforge.net/ GLM: : GLFW: ://...

    Java进阶部分课堂同步代码.rar

    在多线程任务中,处于线程安全[1]的考虑,可以给特定代码片段设置同步锁,只有当该代码块执行完毕并释放锁,后续代码才能向后运行。 现实中的实例: 银行(程序)办理业务,会有多个客户需要办理业务(多线程),但每...

    Unix System Programming (Unix系统编程)

    本书完全覆盖文件、信号、信号量、 POSIX线程以及客户端一服务器通信等内容,对通信、并发和多线程问题进行了深入研究,并对信号和并发等复杂的概念进行了全面深入的解释。本书还包含了关于Web、UDP以及服务器性能等...

    UNIX系统编程 中文版 pdf

    本书完全覆盖文件、信号、信号量、 POSIX线程以及客户端一服务器通信等内容,对通信、并发和多线程问题进行了深入研究,并对信号和并发等复杂的概念进行了全面深入的解释。本书还包含了关于Web、UDP以及服务器性能等...

    python核心编程

    展示数以百计的代码片段、交互实例和大量加强您的Pyttlon技能的实用练习 学习专业的Python风格、最佳实践和好的编程习惯; 加强对Pyttlon对象、内存模型和Pythom面向对象特性的深入理解; 构建更有效的Web、CGI、...

    unix systems programming

    本书完全覆盖文件、信号、信号量、POSIX线程以及客户端一服务器通信等内容,对通信、并发和多线程问题进行了深入研究,并对信号和并发等复杂的概念进行了全面深入的解释。本书还包含了关于Web、UDP以及服务器性能等...

    Python核心编程(第二版).part1.rar

     学习更多的高阶内容,如正则表达式、网络、多线程、图形用户界面、Web/CGl和Python扩展等  包括几个全新的章节,关于数据库、网络客户端、Java/Jytt30n和Microsoft Office等  展示数以百计的代码片段、交互...

    Python核心编程(第二版).part2.rar

     学习更多的高阶内容,如正则表达式、网络、多线程、图形用户界面、Web/CGl和Python扩展等  包括几个全新的章节,关于数据库、网络客户端、Java/Jytt30n和Microsoft Office等  展示数以百计的代码片段、交互...

    Python核心编程(第二版).part3.rar

     学习更多的高阶内容,如正则表达式、网络、多线程、图形用户界面、Web/CGl和Python扩展等  包括几个全新的章节,关于数据库、网络客户端、Java/Jytt30n和Microsoft Office等  展示数以百计的代码片段、交互...

    Python核心编程(第二版).part4.rar

     学习更多的高阶内容,如正则表达式、网络、多线程、图形用户界面、Web/CGl和Python扩展等  包括几个全新的章节,关于数据库、网络客户端、Java/Jytt30n和Microsoft Office等  展示数以百计的代码片段、交互...

    Python 核心编程 目录

     展示数以百计的代码片段、交互实例和大量加强您的Python技能的实用练习  “对Wesley Chun《Python核心编程》第二版的漫长等待是值得的——它的深邃、它的全面,以及它实用的练习将会帮助读者学会并掌握杰出的...

    Python核心编程第二版.pdf

    初学python,这是一本有关python开发的权威指南。 包括正则表达式、网络、多线程、图形用户界面、Web/CGI和python扩展等。 数以百计的代码片段、交互实例和大量加强您的python技能的实用练习。

    python 核心编程 第二版

    第2部分则提供了各种高级主题来展示可以使用Python做些什么,包括正则表达式、网络编程、网络客户端编程、多线程编程、图形用户界面编程、Web编程、数据库编程、扩展Python和一些其他材料。 本书适合Python初学者,...

    Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例(第2部分).pdf

    使用多线程技术完全可以实现在 Applet 中进行动画的播放。为了能够多次更新屏幕,必须 创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求。 2、JApplet 程序的生命周期 JApplet 类中的...

    动脉:基于UE4蓝图的程序建模工具包

    多线程的。 大多数常见的几何运算。 每个点/原始/几何lua代码片段,用于自定义操作。 点/原始组。 点/原始自定义属性。 切线空间和UV坐标生成。 程序静态网格物体实例化。 提供了完整的源代码。链接文献资料1.建模...

    entreri:https的镜像

    其他高级功能包括使用新数据对组件进行运行时装饰,以及面向多线程的任务API以处理实体系统。 Java的垃圾回收可以移动对象,从而在使用对象数组或集合时损害局部性。 通过使用原始数组或将受管数据存储在块中的缓冲...

    Android使用http协议与服务器通信的实例

    网上介绍Android上http通信的文章很多,不过大部分只给出了实现代码的片段,一些注意事项和如何设计一个合理的类用来处理所有的http请求以及返回结果,一般都不会提及。因此,自己对此做了些总结,给出了我的一个...

    net学习笔记及其他代码应用

    26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写: namespace test { public delegate void OnDBOperate(); public class UserControlBase : System.Windows.Forms.UserControl { public ...

Global site tag (gtag.js) - Google Analytics