简单线程池-实例
来源:互联网 发布:淘宝保证金不见了找谁 编辑:程序博客网 时间:2024/05/29 17:24
简单线程池-实例
Task: 目标任务接口类,代表我们要执行的任务。
TaskQueue:任务队列,可以用Queue的随便一个子集。
WorkThread:工作线程,线程池的工作线程,用于去任务队列里取任务调度执行。
ThreadPoolService:线程池服务类,用于构造线程池,开始,关闭线程池等。
SimpleTest:具体任务类,继承Task
Task:
package com.mylearn.threadpool;
/**
* Created by IntelliJ IDEA.
* User: yingkh
* Date: 13-3-19
* Time: 下午5:17
* CopyRight:360buy
* Descrption: 这是代表任务的抽象类(当然接口更好),其中定义了一个deal()方法,集成Task抽象类的
* 子类需要实现这个方法,并把这个任务需要完成的具体工作在deal()方法编码实现。线程池中
* 的线程之所以被创建,就是为了执行各种各样数量繁多的任务的,为了方便线程对任务的处理,
* 我们需要用Task抽象类来保证任务的具体工作统一放在deal()方法里来完成,这样也使代码更加
* 规范
* To change this template use File | Settings | File Templates.
*/
public abstract class Task {
public enum State {
NEW, //新建
RUNNING, //执行中
FINISHIED //已完成
}
private State state = State.NEW;
public abstract void deal(); //具体业务目标方法
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
TaskQueue:
package com.mylearn.threadpool;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: yingkh
* Date: 13-3-19
* Time: 下午6:20
* CopyRight:360buy
* Descrption: 任务队列
* 在同一时刻,可能有很多任务需要执行,而程序在同一时刻只能执行一定数量的任务,当需要执行的任务数超过了
* 程序所能承受的任务数时怎么办呢?这就有了先执行哪些任务,后执行哪些任务的规则。TaskQueue类就定义了这些规则中的一种,它采用的是
* FIFO的方式。也就是按任务到达的先后顺序执行。
* To change this template use File | Settings | File Templates.
*/
public class TaskQueue {
private List<Task> queue = new LinkedList<Task>();//这里使用LinkedList类来保存任务到达的先后顺序
/**
* 用于一个新任务到达时,将它添加到任务队列中,这
* @param task
*/
public synchronized void addTask(Task task) {
if (task != null) {
queue.add(task);
}
}
/**
* 用于任务执行完毕时,将它从任务队里清除出去
* @param task
*/
public synchronized void finishTask(Task task) {
if (task != null) {
task.setState(Task.State.FINISHIED);
queue.remove(task);
}
}
/**
* 用于取得当前要执行的任务
* @return
*/
public synchronized Task getTask() {
Iterator<Task> it = queue.iterator();
Task task;
while (it.hasNext()) {
task = it.next();
//找到第一个新建的任务,设为执行中,返回
if (Task.State.NEW.equals(task.getState())) {
task.setState(Task.State.RUNNING);
return task;
}
}
return null;
}
}
WorkThread:
package com.mylearn.threadpool;
/**
* Created by IntelliJ IDEA.
* User: yingkh
* Date: 13-3-20
* Time: 上午9:54
* CopyRight:360buy
* Descrption: 执行任务的线程类
* 专门处理任务队列中的待执行任务
* To change this template use File | Settings | File Templates.
*/
public class WorkThread implements Runnable {
private ThreadPoolService service;
public WorkThread(ThreadPoolService threadPoolService) {
this.service = threadPoolService;
}
public void run() {
//判断线程池是否在运行状态
while (service.isRunning()) {
// 获取任务,执行
TaskQueue queue = service.getTaskQueue();
Task task = queue.getTask();
if (task != null) {
task.deal();
}
//完成任务后设置移除队列
queue.finishTask(task);
}
}
}
ThreadPoolService:
package com.mylearn.threadpool;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: yingkh
* Date: 13-3-20
* Time: 上午9:54
* CopyRight:360buy
* Descrption: 线程池服务类
*
* 这是线程池最核心的一个类。它在被创建的时候就创建了几个线程对象,但是这些线程并没有启动运行,但调用了start()方法
* 启动线程池服务时,它们才能真正运行。
* To change this template use File | Settings | File Templates.
*/
public class ThreadPoolService {
public static final int THREAD_COUNT = 5; //初始线程数,spring的话定义了几个最小值,域阀值
private TaskQueue queue = new TaskQueue(); // 任务队列
private Status stats = Status.NEW; //初始状态
public enum Status { //定义线程池的几个状态
NEW,
RUNNING,
STOP
}
private List<Thread> threads = new ArrayList<Thread>(); //初始线程
//构造时创建几个初始任务线程
public ThreadPoolService() {
for(int i = 0; i < THREAD_COUNT; i++) {
WorkThread t = new WorkThread(this);
threads.add(new Thread(t));
}
}
/**
* 启动线程,依次执行任务线程
*/
public void start() {
this.stats = Status.RUNNING;
for(int i = 0 ; i < THREAD_COUNT; i++) {
threads.get(i).start();
}
}
public void stop() {
this.stats = Status.STOP;
}
public boolean isRunning() {
return stats == Status.RUNNING;
}
/**
* 加入任务到线程池队列
* @param task
*/
public void runTask(Task task) {
queue.addTask(task);
}
protected TaskQueue getTaskQueue() {
return queue;
}
}
Client:
package com.mylearn.threadpool;
/**
* Created by IntelliJ IDEA.
* User: yingkuohao
* Date: 13-10-29
* Time: 下午2:30
* CopyRight:360buy
* Descrption:
* To change this template use File | Settings | File Templates.
*/
public class Client {
public static void main(String args[]) throws InterruptedException {
ThreadPoolService threadPoolService = new ThreadPoolService();
for (int i = 0; i < 10; i++) {
threadPoolService.runTask(new SimpleTest(i + ""));
}
threadPoolService.start();
Thread.sleep(1000); //等待所有线程执行完毕,睡一秒
threadPoolService.stop();
}
}
- 简单线程池-实例
- python 简单线程池实例
- 一个简单的JAVA线程池实例
- java简单线程池实例代码
- c# 线程简单实例
- java 简单线程实例
- java线程及操作实例,线程池简单例子
- 线程Semaphore的简单实例
- linux线程使用简单实例
- 线程简单实例-易犯错误
- python之多线程简单实例
- Java——线程池的简单实例
- Java线程等待、通知简单实例代码
- QT线程QThread的简单使用实例
- thread包 一个简单的线程实例
- 简单实例化解析安卓Thread线程
- 线程--简单多线程通信实例
- 线程 线程池 线程同步 实例
- Android中子线程更新主线程UI和ProgressBar的应用
- 打开外部文件-如打开pdf文件
- win32 socket的两个简单的例子
- 思科H.264开源解码器将被用在火狐中
- mongo mapreduce
- 简单线程池-实例
- 表达式计算的问题
- ArcGIS Runtime SDK v10.2新特性
- 判断字符串内是否又连续出现n次的方法
- vbs查询系统信息(名称,版本,系统盘,32or64)-wmi
- CGridCtrl 要仔细用
- 运动检测(前景检测)之(二)混合高斯模型GMM
- UIWebView体系结构(四)UIWebBrowserView
- UIWebView体系结构(六)UIWebView