`
sunwtrain
  • 浏览: 4004 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

多线程成对特性

 
阅读更多
http://www.cnblogs.com/skywang12345/p/java_threads_category.html
http://www.itzhai.com/category/server-side/j2ee/java


join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码,指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 。

Callable和Future
wait(),和notify()、notifyAll()
如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用。它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。所谓屏障点就是一组任务执行完毕的时刻。



Java之CyclicBarrier使用
1、类说明:
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

2、使用场景:
需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。

CountDownLatch,先await,如果递减countDown到0才执行await后面的,CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行
CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。下面以一个模拟运动员比赛的例子加以说明。

首先,CyclicBarrier可以多次使用,CountDownLatch只能用一次(为0后不可变)
其次,
Barrier是等待指定数量线程到达再继续处理;
Latch是等待指定事件变为指定状态后发生再继续处理,对于CountDown就是计数减为0的事件,但你也可以实现或使用其他Latch就不是这个事件了...

Barrier是等待指定数量任务完成,Latch是等待其他任务完成指定状态的改变再继续。。

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   CyclicBarrier        : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。




CountDownLatch 是计数器, 线程完成一个就记一个, 就像 报数一样, 只不过是递减的.

而CyclicBarrier更像一个水闸, 线程执行就想水流, 在水闸处都会堵住, 等到水满(线程到齐)了, 才开始泄流.




package com.thread;

import java.io.IOException;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {

	public static void main(String[] args) throws IOException, InterruptedException {
		//如果将参数改为4,但是下面只加入了3个选手,这永远等待下去
		//Waits until all parties have invoked await on this barrier. 
		CyclicBarrier barrier = new CyclicBarrier(3);

		ExecutorService executor = Executors.newFixedThreadPool(3);
		executor.submit(new Thread(new Runner(barrier, "1号选手")));
		executor.submit(new Thread(new Runner(barrier, "2号选手")));
		executor.submit(new Thread(new Runner(barrier, "3号选手")));

		executor.shutdown();
	}
}

class Runner implements Runnable {
	// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
	private CyclicBarrier barrier;

	private String name;

	public Runner(CyclicBarrier barrier, String name) {
		super();
		this.barrier = barrier;
		this.name = name;
	}

	@Override
	public void run() {
		try {
			Thread.sleep(1000 * (new Random()).nextInt(8));
			System.out.println(name + " 准备好了...");
			// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
			//System.out.println(barrier.getNumberWaiting()+1);
			if(barrier.getParties() == (barrier.getNumberWaiting()+1)){
				System.out.println("all over");
			}
			barrier.await();
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
		System.out.println(name + " 起跑!");
	}
}





package com.thread;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 一个CountDouwnLatch实例是不能重复使用的,也就是说它是一次性的,锁一经被打开就不能再关闭使用了,如果想重复使用,请考虑使用CyclicBarrier。
public class CountDownLatchTest {

    // 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。
    public static void main(String[] args) throws InterruptedException {
    	final int nums = 10;
    	
        // 开始的倒数锁 
        final CountDownLatch begin = new CountDownLatch(1);  

        // 结束的倒数锁 
        final CountDownLatch end = new CountDownLatch(nums);  

        // 十名选手 
        final ExecutorService exec = Executors.newFixedThreadPool(nums);  

        for (int index = 0; index < nums; index++) {
            final int NO = index + 1;  
            Runnable run = new Runnable() {
                public void run() {  
                    try {  
                        begin.await();  // 等待,后面不会执行,只有begin变为0后才执行
                        Thread.sleep((long) (Math.random() * 10000));  
                        System.out.println("No." + NO + " arrived");  
                    } catch (InterruptedException e) {  
                    } finally {  
                        end.countDown();// 每个选手到达终点时,end就减一,直到总的10减为0
                    }  
                }  
            };  
            exec.execute(run);
        }  
        System.out.println("Game Start");  
        begin.countDown();  //begin减一,begin从1到0,开始游戏
        end.await();  // 等待end变为0,即所有选手到达终点
        System.out.println("Game Over");  
        exec.shutdown();  
    }
}

分享到:
评论

相关推荐

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

    "鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地...通过分析和实践"鱼刺多线程注册源码",不仅可以提高对多线程编程的理解,还能为以后的项目提供宝贵的实践经验。

    pb9多线程控件,能够真实实现多线程

    "虽不太完善"暗示这个控件可能存在一些未解决的问题或者未完善的特性,但仍然可以有效地实现多线程操作。"而不是PB本身所实现的共享机制"指的是,PowerBuilder自身可能提供了一种线程共享数据的机制,但这种机制并不...

    多线程编程示例

    在IT领域,多线程编程是一项关键技能,尤其是在性能优化和并发处理方面。本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的...

    vb模拟多线程 本地Timer对多线程

    在VB(Visual Basic)编程环境中,由于其原生特性不直接支持多线程,开发者往往需要借助外部API(应用程序接口)来实现多线程功能。标题提到的“vb模拟多线程 本地Timer对多线程”就是一种常见的解决策略,通过使用...

    多线程的运用e语言多线程 e多线程

    多线程是操作系统提供的一个特性,它允许多个任务在单个进程中并行执行。在E语言中,多线程能够帮助开发者在处理大量I/O操作、复杂的计算任务或者需要实时交互的应用场景时,提高程序的效率。通过创建多个线程,每个...

    多线程基础与基于多线程的简单聊天室

    本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...

    易语言多线程访问网页

    在易语言中,多线程技术是一项重要的特性,它允许程序同时执行多个任务,提高了程序的执行效率。本主题将深入探讨如何使用易语言实现多线程访问网页的功能。 在多线程访问网页的场景中,通常涉及到以下几个关键知识...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。Delphi,作为一个流行的Object Pascal开发环境,提供了丰富的工具和库来支持多线程编程。本篇文章将深入...

    易语言源码多线程多任务下载软件.rar

    《易语言源码多线程多任务下载软件》是一款基于易语言编程的高效下载工具,其核心特性在于利用多线程技术实现多个文件的同时下载,提高下载效率,满足用户快速批量下载的需求。本文将深入探讨易语言编程环境、多线程...

    C#多线程编程实战 源代码

    在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、高响应性应用程序的关键因素。如果你没有正确地使用多线程,它会导致难以捉摸的问题,需要你花费大量时间去解决。因此,现代应用程序...

    多线程发邮件

    本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将深入探讨相关知识点。 首先,多线程是指在一个进程中同时执行多个线程,这些线程可以共享同一块内存...

    vb多线程程序

    在VB 6.0编程环境中,多线程技术是一种关键的高级特性,它允许应用程序同时执行多个任务,提高系统的响应速度和效率。本教程通过一个简单的小例子来讲解如何在VB 6.0中实现多线程。 首先,我们要了解线程是什么。...

    可并行递归算法的递归多线程实现

    在递归算法中,利用Java的多线程特性可以显著提升算法的执行效率,尤其是在处理大规模数据集时。例如,快速排序算法,一个经典的递归算法,可以通过并行处理两个子数组的排序过程,从而大幅减少排序所需的时间。 ##...

    多线程demo/java多线程练习

    - **事务处理**:在多线程中进行数据库操作时,事务的ACID特性(原子性、一致性、隔离性、持久性)显得尤为重要,项目可能涉及如何在并发环境下保证事务的正确性。 通过这个"多线程demo/java多线程练习"项目,你...

    演示PB如何实现多线程

    在PowerBuilder(PB)开发环境中,多线程技术是一种关键特性,它允许应用程序同时执行多个独立的任务,提高程序的响应性和效率。本示例通过"thread.pbl"和"testthread.pbl"两个对象,展示了如何在PB中实现多线程。 ...

    java多线程之赛马程序实验8多线程练习下载进度

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。本实验"java多线程之赛马程序实验8多线程练习下载进度"聚焦于如何利用多线程来模拟实际场景中的下载进度显示。在这一过程中,...

    JAVAJAVA多线程教学演示系统论文

    总的来说,《JAVA多线程教学演示系统》这篇论文不仅是对JAVA多线程技术的理论探讨,更是一个实践与教学相结合的优秀范例,对于提升学生的多线程编程能力具有很高的参考价值。VB图书管理系统论文范文虽不在本文讨论...

    FFmpegH264 多线程 优化

    本项目专注于FFmpeg中的H264解码库,通过引入多线程和硬件加速技术如MMX、SSE(Streaming SIMD Extensions)和AVX(Advanced Vector Extensions),来提升解码性能和效率。 多线程技术在FFmpeg中的应用主要是为了...

    C# UDP多线程发送接收

    总结,C# UDP多线程通信是网络编程中的一个重要实践,它结合了UDP的高效传输特性和多线程的并发优势,适用于处理大量并发的网络请求。在实际项目中,开发者需要根据具体需求选择合适的同步机制,保证程序的稳定性和...

Global site tag (gtag.js) - Google Analytics