`

java多线程 Semaphore CountDownLatch ScheduledExecutorService

阅读更多

参考:http://www.ibm.com/developerworks/cn/java/j-5things5.html

【关于 java.util.concurrent 您不知道的 5 件事,第 2 部分】

1,Semaphore

适用于:限制未处理的特定资源请求(线程/操作)数量。

public class SemApp {
    public static void main(String[] args) {
        Runnable limitedCall = new Runnable() {
            final Random rand = new Random();
            final Semaphore available = new Semaphore(3);
            int count = 0;
            public void run() {
                int time = rand.nextInt(15);
                int num = count++;
                try {
                    available.acquire();
                    System.out.println("Executing " + 
                        "long-running action for " + 
                        time + " seconds... #" + num);
                    Thread.sleep(time * 1000);
                    System.out.println("Done with #" + 
                        num + "!");
                    available.release();
                } catch (InterruptedException intEx) {
                    intEx.printStackTrace();
                }
            }
        };
        
        for (int i=0; i<10; i++)
            new Thread(limitedCall).start();
    }
}

 程序中实现了,限制了同时打开的任务数是三个。

结果 写道
Executing long-running action for 9 seconds... #0
Executing long-running action for 7 seconds... #2
Executing long-running action for 0 seconds... #1
Done with #1!
Executing long-running action for 1 seconds... #3
Done with #3!
Executing long-running action for 6 seconds... #4
Done with #2!
Executing long-running action for 5 seconds... #5
Done with #4!
Executing long-running action for 6 seconds... #6
Done with #0!
Executing long-running action for 12 seconds... #7
Done with #5!
Executing long-running action for 1 seconds... #8
Done with #8!
Executing long-running action for 12 seconds... #9
Done with #6!
Done with #7!
Done with #9!

 

对于特定资源和线程访问数的限定Semaphore是个不错的选择。这里使用了Semaphore一次使用和释放一个通行证,Semaphore还可以一次使用和释放多个通行证。

2,CountDownLatch

public class CDLApp {
	public static void main(String[] args)
	throws InterruptedException, java.io.IOException {
		System.out.println("Prepping...");
		Race r = new Race(
				"horse 1",	"horse 2",	"horse 3",	"horse 4",
				"horse 5",	"horse 6",	"horse 7",	"horse 8"
		);
		System.out.println("It's a race of " + r.getDistance() + " lengths");
		System.out.println("Press Enter to run the race....");
		System.in.read();
		r.run();
	}
}
class Race {
	private Random rand = new Random();
	private int distance = rand.nextInt(250);
	private List<String> horses = new ArrayList<String>();
	public Race(String... names) {
		this.horses.addAll(Arrays.asList(names));
	}
	public int getDistance() {return distance;}

	public void run() throws InterruptedException {
		System.out.println("And the horses are stepping up to the gate...");
		final CountDownLatch start = new CountDownLatch(1);
		final CountDownLatch finish = new CountDownLatch(horses.size());
		final List<String> places =
			Collections.synchronizedList(new ArrayList<String>());

		for (final String h : horses) {
			new Thread(new Runnable() {
				public void run() {
					try	{
						start.await();//等待赛马开始
						
						System.out.println(h + 
								" stepping up to the gate...");

						int traveled = 0;
						while (traveled < distance)	{
							//前进一次 暂停 0-2 秒
							Thread.sleep(rand.nextInt(3) * 1000);
							//前进 0-14 米
							traveled += rand.nextInt(15);
							System.out.println(h + 
									" advanced to " + traveled + "!");
						}
						System.out.println(h + 
						" crossed the finish!");
						places.add(h);
						
						finish.countDown();//一个马到达终点就 减去一, 倒数完成比赛结束
					}
					catch (InterruptedException intEx) {
						System.out.println("ABORTING RACE!!!");
						intEx.printStackTrace();
					}
				}
			}).start();
		}
		System.out.println("And... they're off!");
		start.countDown();//开始赛马

		finish.await();//等待所有的马跑完
		System.out.println("============================================");
		System.out.println("And we have our winners!");
		System.out.println("<"+places.get(0)+">" + " took the gold...");
		System.out.println("<"+places.get(1)+">" + " got the silver...");
		System.out.println("and " + "<"+places.get(2)+">" + " took home the bronze.");
		System.out.println("============================================");
	}
}

 

上面的程序利用CountDownLatch 描述一个赛马的过程,首先让所有马在门闩那里(start.countDown();//开始赛马)等待开始,每匹马冲过终点后(finish.countDown),finish.await()等待所有的马冲过终点后,发奖牌。

3,ScheduledExecutorService

public class Ping {
	public static void main(String[] args) {
        ScheduledExecutorService ses =
            Executors.newScheduledThreadPool(1);
        Runnable pinger = new Runnable() {
            public void run() {
                System.out.println("PING!");
            }
        };
        ses.scheduleAtFixedRate(pinger, 1, 2, TimeUnit.SECONDS);
    }
}

 

模拟心脏每隔2秒钟跳动一次。顺便说一下,如果用户希望取消心跳,scheduleAtFixedRate 调用将返回一个 ScheduledFuture 实例,它不仅封装了结果(如果有),还拥有一个 cancel 方法来关闭计划的操作。

 

分享到:
评论

相关推荐

    Java多线程资料

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...

    深入浅出Java多线程.pdf

    ### 深入浅出Java多线程.pdf #### 知识点概览 本PDF文档涉及了Java多线程的全面介绍,分为基础篇、原理篇和JDK工具篇三个部分,旨在帮助读者深入了解Java多线程的概念、原理及实践应用。 #### 基础篇 **1. 进程...

    JAVA多线程教材

    2. **线程同步与通信**:在多线程环境中,数据共享可能导致竞态条件和死锁,Java提供了多种同步机制来避免这些问题,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、Semaphore等)以及wait()、...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    根据给定文件的信息,我们可以提炼出以下关于Java多线程与并发库的相关知识点: ### Java多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...

    Java多线程实战精讲-带你一次搞明白Java多线程高并发

    Java多线程实战精讲是Java开发者必备的技能之一,特别是在处理高并发场景时,它的重要性不言而喻。本文将深入探讨Java多线程的相关知识点,帮助你全面理解并掌握这一核心概念。 1. **线程基础** - **线程定义**:...

    java多线程总结

    Java并发包(java.util.concurrent)提供了许多高效且线程安全的工具类,如Semaphore(信号量)、CyclicBarrier(屏障)、CountDownLatch(计数器门锁)等,便于编写多线程程序。 通过理解和掌握以上知识点,...

    基于java多线程的一款小游戏.zip

    Java并发包(java.util.concurrent)提供了许多实用工具,如`CountDownLatch`用于多线程间的协调,`CyclicBarrier`让一组线程等待所有线程到达某个点后再继续,`Semaphore`用于控制并发访问数量。这些工具可能在...

    java多线程设计

    Java多线程设计是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。下面我们将深入探讨这个主题,包括核心...

    java基础,多线程,反射

    线程间通信和同步是多线程编程的关键,Java提供了`synchronized`关键字、`wait()`, `notify()` 和 `notifyAll()` 方法,以及`java.util.concurrent`包下的高级并发工具如`Semaphore`, `CyclicBarrier`, 和 `...

    java多线程核心编程技术

    Java的`Executor`框架提供了一种更高级别的多线程管理机制,主要由三个组件组成:`Executor`、`ThreadPoolExecutor`、`ScheduledExecutorService`。 - **Executor**:最简单的任务执行服务接口,定义了执行命令的...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    java多线程编程实践

    ### Java多线程编程实践 #### 一、`concurrent`包提供的集合 在Java中,`java.util.concurrent`包提供了许多高级并发工具类和容器,这些类在多线程环境中能够有效地提升程序的性能与可靠性。下面详细介绍该包中的...

    多线程下载含速度、进度

    这个主题主要涉及到“多线程”、“速度”和“进度”这些关键概念,尤其是在Java编程语言中的实现。 多线程是操作系统提供的一种并发执行任务的方式,允许程序同时执行多个线程。在下载场景中,多线程意味着将一个大...

    thread.zip--狂神多线程+juc

    《狂神多线程+juc》是一份针对Java并发编程深度学习的资源包,主要涵盖了Java多线程基础以及Java并发工具集(JUC)的高级应用。在Java编程中,多线程是提高程序效率、实现并发执行的重要手段,而JUC(Java ...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    java面试题_多线程(68题)

    Java多线程是Java编程中的核心概念,尤其在面试中,它是考察开发者高级技能和并发理解的关键领域。这里,我们将深入探讨与Java多线程相关的68个面试问题,涵盖基础知识、线程安全、同步机制、线程池、死锁等关键知识...

    Java项目新手练习小项目

    这个“Java项目新手练习小项目”旨在帮助初学者熟悉Java语言的基础知识,特别是多线程这一核心概念。多线程是Java中的重要特性,它允许程序同时执行多个任务,从而提高系统的效率和响应速度。 一、Java多线程基础 ...

    多线程并发的demo

    `java.util.concurrent`包下有各种高级并发工具,如`Semaphore`(信号量)用于控制同时访问特定资源的线程数量,`CyclicBarrier`和`CountDownLatch`用于协调多个线程的启动或结束。 在Web项目中,多线程的使用还需要...

    JAVA-multithreaded-programming.rar_Java @multithreaded_java prog

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的核心...

    Java Concurrency in Practice

    3. **并发工具**:书中详细探讨了Java并发库中的各种工具类,如Executor框架、Semaphore信号量、CountDownLatch倒计时器、CyclicBarrier同步屏障、Future和Callable接口,以及BlockingQueue阻塞队列。这些工具帮助...

Global site tag (gtag.js) - Google Analytics