`
xiaojiit
  • 浏览: 129465 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java单线程池

    博客分类:
  • Java
 
阅读更多
package com.hebei.read.core.plugins.thread;

import java.util.LinkedList;

/**
 * 自定义线程池
 * 
 * @author Admin
 * 
 */
public class SinglePool extends ThreadGroup {

	private static boolean isClose = false;// 线程池是否关闭
	private static LinkedList workQueue; // 工作队列
	private static SinglePool pool = null;
	private static WorkThread work = null;

	public static SinglePool getInstance() {
		if (pool == null) {
			pool = new SinglePool();
		}
		return pool;
	}

	/**
	 * 初始化线程池
	 * 
	 * @param poolSize
	 */
	private SinglePool() {
		super("zaichi thread group");
		setDaemon(true);
		workQueue = new LinkedList();
		work = new WorkThread();
		work.start();
	}

	public synchronized void execute(Runnable task) {
		if (isClose) {
			throw new IllegalStateException();
		}
		if (task != null) {
			workQueue.add(task);
			notify();
		}
	}

	// 从工作队列中取出一个任务,工作线程会调用该方法
	private synchronized Runnable getTask() throws InterruptedException {
		while (workQueue.size() == 0) {
			if (isClose) {
				return null;
			}
			wait(); // 如果工作线程中没有任务,那么就等待着
		}
		return (Runnable) workQueue.removeFirst();// 返回队列中的第一个元素,并从队列中删除
	}

	/**
	 * 线程是否在运行
	 * 
	 * @return
	 */
	public synchronized boolean isRunning(Thread t) {
		return workQueue.size() > 0 || work.isRunning();
	}

	/**
	 * 线程是否在运行
	 * 
	 * @return
	 */
	public synchronized boolean isRunning() {
		return workQueue.size() > 0 || work.isRunning();
	}

	// 等待工作线程把任务执行完成
	private void waitFinish() {
		synchronized (this) {
			isClose = true;
			notifyAll(); // 唤醒所有还在getTask()方法中等待任务的工作线程
		}
		Thread[] threads = new Thread[activeCount()]; // activeCount()返回该线程组中活动线程的估计值
		int count = enumerate(threads); // enumerate方法继承自ThreadGroup,根据活动的线程的估计值获得该线程组中当前所有活动的工作线程
		for (int i = 0; i < count; i++) { // 等待所有工作线程结束
			try {
				threads[i].join(); // 等待工作线程结束
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	// 关闭线程池
	public synchronized void shutdown() {
		if (!isClose) {
			waitFinish(); // 等待工作线程执行完毕
			isClose = true;
			workQueue.clear(); // 清空工作队列
			interrupt(); // 中断线程池所有的工作线程
		}
	}

	/**
	 * 多线程的工作线程
	 * 
	 * @author Admin
	 * 
	 */
	private class WorkThread extends Thread {

		private boolean running = false;
		private int m = 0;

		public WorkThread() {
			super(SinglePool.this, "zaichi single thread");
		}

		public boolean isRunning(int n) {
			if (m == n) {
				return running;
			} else {
				return false;
			}
		}

		public boolean isRunning() {
			return running;
		}

		public void run() {
			while (!isInterrupted()) { // 继承自Thread,判断线程是否被中断
				Runnable task = null;
				try {
					task = getTask(); // 取出任务
					m = task.hashCode();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
				if (task == null) {
					return;
				}
				running = true;
				task.run(); // 运行任务
				running = false;
			}
		}
	}
}

 

分享到:
评论

相关推荐

    java多线程代理IP池

    多线程代理IP池,一直看到有关这方面的技术,最近实现了一个。简单的来说,启动后,会一直定时的获取代理ip,并自动检测代理ip的活跃度。运用多线程的技术,在极短的时间内获取大量的ip进行筛选。架构也比较清楚,...

    java线程详解

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步...

    java最终.pdf

    我试下是否能获取积分 newSingleThreadExecutor():线程数目为1 newFixedThreadpool():指定数目的线程 newSingleThreadSchdeuledExecutor():单线程池

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包101

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...

    memcached的三种java客户端jar

    2.spymemcached,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。 3.xmemcached,XMemcached也使用得比较广泛,而且...

    R2高性能数据库连接池v1.5源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包7

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics