`
chrischen214
  • 浏览: 1142 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

多线程编程一:带有信号量及计数器的多线程线程池

阅读更多

最近项目要用到多线程处理任务。
写了个线程工具。
用到了JDK的多线程工具,信号量Semaphore及计数器CountDownLatch
Semaphore用来控制任务的提交速率
当所有任务被submit后, 执行await(time), 等待计数器清零后手动关闭线程池


package org.leo.concurrent;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * 带有信号量及计数器的多线程线程池
 * <p>semaphore用来控制任务的提交速率,countDownLatch</p>
 * <br/>信号量及线程数为 m, 任务数n, 一般n较大于m 如n=100,m=8
 * @author Leo
 */
public class SemaphoreCountDownExecutor {

	private Semaphore semaphore;
	private CountDownLatch countDownLatch;
	private ExecutorService executor;
	
	/**
	 * 对象初始化
	 * @param semaphorePermits
	 * @param count
	 */
	public SemaphoreCountDownExecutor(final int semaphorePermits,final int count) {
		semaphore = new Semaphore(semaphorePermits);
		executor = Executors.newCachedThreadPool();
		countDownLatch = new CountDownLatch(count);
	}
	
	/**
	 * 等待计数器归零, 并设置超时时间
	 * @param timeSeconds
	 */
	public void await(final long timeSeconds){
		try {
			if(timeSeconds<=0)
				countDownLatch.await(60*60, TimeUnit.SECONDS);
			else
				countDownLatch.await(timeSeconds, TimeUnit.SECONDS);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		executor.shutdown();//关闭线程池
	}
	/**
	 * 提交一个任务到线程池,获取一个信号量并计数器减一
	 * @param command
	 * @throws InterruptedException
	 */
	public void submit(final Runnable command) throws InterruptedException {
		semaphore.acquire(); //接收一个信号量,此处可能抛出InterruptedException
		try {
			executor.execute(new Runnable() {
				@Override
				public void run() {
					//run中是同步执行
					try {
						command.run();
					}  finally {
						semaphore.release();//线程异常时释放信号量
						countDownLatch.countDown();//执行结束计数器-1
					}
				}
			});
		} catch (Exception e) {//捕获线程池异常时, 释放信号及计数器-1
			countDownLatch.countDown();//执行结束计数器-1
			semaphore.release();
		}
		
	}
	public static void main(String[] args) {
		final SemaphoreCountDownExecutor executor = new SemaphoreCountDownExecutor(10, 100);
		for (int i = 0; i < 100; i++) {
			final int fi = i;
			try {
				executor.submit(new Runnable() {
					@Override
					public void run() {
						System.out.println(fi+","+Thread.currentThread().getName());
						try {
							Thread.sleep(new Random().nextInt(1500));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				});
			} catch (Exception e) {
				e.printStackTrace();
			}
		}//end for
		executor.await(30);//线程池使用的newCachedThreadPool,可以不手动关闭, 不过使用await可以等待任务同时执行结束以便,进行下一步的动作
		System.out.println("end");
	}
}

分享到:
评论

相关推荐

    c++多线程同步——信号量

    在C++编程中,多线程同步是一种关键的技术,它允许多个执行线程协同工作,以避免数据竞争和死锁等并发问题。信号量(Semaphore)是实现多线程同步的一种有效工具,常用于控制对共享资源的访问。在这个名为"Mthread11...

    VC多线程编程,利用信号量进行控制

    了解并熟练掌握信号量的使用,有助于编写高效、可靠的多线程程序。在实际编程中,还需要注意避免死锁、饥饿等潜在问题,合理设置信号量的初始值和最大值,以及正确处理各种异常情况,确保程序的健壮性。通过深入学习...

    多线程编程基础.pdf

    在现代软件开发中,多线程编程已经成为了一项不可或缺的技能。多线程编程是指在单个程序中同时运行多个线程(Thread),每个线程都可以独立执行程序的一部分,从而实现并行处理,提高程序的执行效率和响应速度。下面...

    多线程编程中英文对照.rar

    1. **多线程概念**:多线程是指一个应用程序中存在多个执行线程,每个线程都有自己的程序计数器、系统资源和栈空间。通过多线程,程序可以同时处理不同的任务,比如用户界面更新和后台数据计算。 2. **Symbian OS中...

    多线程编程指南

    《多线程编程指南》是针对Linux环境下进行多线程编程的一本实用指南。在Linux系统中,多线程编程是一种高效利用系统资源、提高程序并发执行能力的技术。本指南将深入探讨多线程的概念、原理以及实际应用,旨在帮助...

    多线程编程实例适合网络编程人员

    在IT行业中,多线程编程是一项至关重要的技术,特别是在网络编程领域。多线程使得一个程序可以同时执行多个任务,从而提高系统效率和响应速度。本文将深入探讨多线程编程实例及其在网络编程中的应用。 首先,理解多...

    多线程编程的资料(自己收集的)

    **多线程编程**是一种软件设计技术,允许程序中的多个任务或功能同时执行,这有助于提高计算机系统的利用率和应用程序的响应能力。多线程的概念源于对并发执行的需求,即在同一时间内执行多个任务的能力。 #### 二...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    java 多线程编程指南

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统效率和响应性。这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程...

    Windows环境下的多线程编程原理与应用.rar

    在Windows环境下进行多线程编程是一项复杂而关键的技术,它涉及到操作系统如何管理和调度多个执行流,使得程序可以同时处理多项任务。以下是对Windows多线程编程的一些核心知识点的详细阐述。 1. **线程概念**:...

    多线程编程的入门指导(英文版)

    多线程编程是一种在单个程序中同时执行多个任务的技术,它使得计算机系统能更高效地利用处理器资源,提高程序的响应速度和并发性。在本文中,我们将深入探讨多线程编程的基础知识,帮助初学者理解这一重要的编程概念...

    多线程编程源代码

    例如,在多线程编程中,如果有一个固定大小的缓冲区,可以使用信号量来控制写入和读取线程的并发数量,保证不会超出缓冲区的容量。 5. **事件同步**:事件同步主要用于解决线程间的同步和通信问题。例如,生产者-...

    多线程编程指南--c版

    1. **多线程概念**:多线程是指在一个进程中可以同时执行多个线程,每个线程都有自己的程序计数器、系统栈、局部变量和状态。这种方式允许程序并行执行不同的任务,提高系统资源利用率和程序响应速度。 2. **线程...

    多线程编程介绍

    1. 线程:线程是程序执行的最小单元,每个线程都有自己的程序计数器、栈、局部变量和状态,它们共享同一块内存空间,即进程的地址空间。 2. 进程:进程是操作系统资源分配的基本单位,包含一个或多个线程。 3. 并发...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    "鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...

    Visual C++信号量线程同步的简单实例工程

    每个工作线程在运行时会调用WaitForSingleObject函数等待信号量,当信号量计数器非零时,线程可以继续执行,否则将被挂起。 3. **资源的访问**:在线程函数内部,一旦获取到信号量,线程就可以安全地访问共享资源。...

    Windows多线程编程详解

    在Windows操作系统中,多线程编程是一种常见的编程模式,它允许多个执行单元(线程)在单个进程中并发运行,从而提高程序的执行效率和响应性。在本篇文章中,我们将深入探讨Windows多线程编程的核心概念、实现方法...

    《Java多线程编程实例》随书源码

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。《Java多线程编程实例》这本书深入浅出地探讨了Java中的多线程编程,通过丰富的实例帮助读者...

    Linux多线程编程手册,linux多线程编程手册pdf,C,C++

    C++和C语言提供了丰富的接口来实现这一目标,特别是在Linux环境下,可以利用POSIX线程库(pthread)进行多线程编程。本手册专注于讲解如何在Linux系统中利用C和C++进行多线程开发,特别关注网络编程中的多线程应用。...

Global site tag (gtag.js) - Google Analytics