`
xiaojiit
  • 浏览: 133101 次
  • 性别: 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多线程处理数据库数据

    4. **数据库连接管理**:在多线程环境中,连接池(如C3P0、HikariCP)是高效管理数据库连接的工具,它能重用连接,避免频繁创建和销毁带来的开销。 通过以上方法,我们可以在Java中有效地利用多线程处理数据库数据...

    Java多线程技术精讲

    Java提供了wait()、notify()和notifyAll()方法,这些方法与synchronized配合使用,可以在对象的等待池中唤醒或通知其他线程。另外,java.util.concurrent包中的BlockingQueue是一个高效的线程间通信工具,它可以安全...

    Java多线程编程全部源码

    线程池可以通过`Executors`工厂类创建,例如固定大小线程池、单线程池、缓存线程池等。 8. **死锁(Deadlock)**:当两个或多个线程相互等待对方释放资源而形成的一种僵局。避免死锁的关键是避免循环等待,合理设计...

    android 单线程 多线程下载

    本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、工具应用等方面进行详细讲解。 首先,我们了解下Android中的...

    java 多线程数据库操作

    在Java编程中,多线程技术常常用于提升应用程序的性能,特别是在处理大量数据时,如数据库操作。本主题将深入探讨如何在Java中利用多线程进行高效的数据库操作,特别是分页读取数据的策略。 首先,理解多线程的基本...

    java线程详解

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

    java ftpClient 连接池设计

    在Java开发中,FTP(File Transfer Protocol)客户端的连接池设计是提高系统性能和资源管理效率的重要技术。连接池允许程序重复使用已经建立的FTP连接,避免了频繁创建和关闭连接带来的开销,提升了整体的运行效率。...

    java定时器\多线程(池)\java队列Demo

    需要注意的是,`Timer` 是单线程的,多个任务可能会按照它们被调度的顺序串行执行,而不是并行。 ```java Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { // ...

    Java多线程优化百万级数据

    在处理海量数据时,如果单线程串行执行,可能会造成CPU利用率低下,程序响应时间过长。 优化策略通常包括以下几个方面: 1. **任务拆分**:将大规模任务分解为若干个小任务,每个任务由一个独立的线程执行。例如,...

    java 多线程软件

    在传统的单线程FTP服务器中,服务器每次只能处理一个客户端的请求,当有新的请求到来时,服务器必须等待当前请求处理完毕才能响应下一个请求。这种方式在用户数量较少的情况下尚可接受,但在高并发场景下则显得效率...

    java 多线程实例

    等待的线程会被放入对象的等待池中,必须重新获取锁才能继续执行。 - `notify()`: 唤醒在该对象上等待的单个线程。如果有多个线程在等待,哪个线程被唤醒是不确定的。一旦被唤醒,线程需要再次竞争对象的锁才能...

    java手写连接池

    总的来说,Java手写连接池是对数据库连接管理的一种高级技巧,它涉及到了Java IO、多线程、数据库API以及系统优化等多个方面的知识。通过这个实践,开发者可以深入理解数据库连接的生命周期管理,提高系统的效率和可...

    java多线程设计

    - **数据库连接池**:多线程环境下,高效管理和复用数据库连接。 - **定时任务**:ScheduledExecutorService用于定期执行任务,例如心跳检测、定时备份等。 7. **学习资源** - 《Java并发编程实战》:深入理解...

    java 多线程编程

    - **线程池**:预先创建一组线程,当需要执行任务时,从池中获取线程而不是每次创建新的线程,可以有效减少线程创建和销毁的开销。 - **Executor框架**:Java提供ExecutorService接口和ThreadPoolExecutor类来管理...

    java多线程核心编程技术

    - **wait()**:使当前线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。 - **notify()**:唤醒正在等待该对象的单个线程。 ##### ...

    java中线程的有效使用

    调用`wait()`后,线程会进入等待池,而非阻塞队列,等待被唤醒。 `notify()`方法用于唤醒一个正在等待该对象的锁的线程。如果有多个线程在等待,系统会随机选择一个进行唤醒。`notifyAll()`则会唤醒所有等待的线程...

    java线程学习笔记

    wait()方法使当前线程等待,直到其他线程调用此对象的notify()或notifyAll()方法,而notify()和notifyAll()则分别通知在等待池中的单个或者所有线程开始运行。 总结来说,这份学习笔记详细地概述了Java多线程编程的...

    单线程 多线程 线程池 计算随机数的一价和

    **单线程**:单线程是指程序的执行流程只有一个线程,这意味着程序的所有操作都会按照顺序依次进行。在单线程环境中,计算随机数的一价和意味着程序会逐一生成随机数,然后逐个累加,直到所有随机数都被处理。这种...

    Java多线程编程要点

    这两种方法都可以让类具备多线程的能力,但通常推荐使用`Runnable`接口,因为它遵循了“接口优于实现”的原则,可以避免单继承的限制。 1. **认识Thread和Runnable** - **Thread类** 是Java内置的线程类,直接继承...

Global site tag (gtag.js) - Google Analytics