ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)

关于等待状态的线程调用interrupt方法报异常:InterruptedException

当线程被阻塞,比如wait,join,sleep等,在调用interrupt方法,没有占用cpu运行的线程是不可能给自己的中断状态置位的,这就产生了InterruptedException异常.

一.CountDownLatch(允许一个或多个线程等待其它线程完成操作)

代码实例:

package com.thread.ccse;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * Created by IntelliJ IDEA.
 * User: 周强
 * Description:
 * Date: 2017/8/9
 * Time: 21:04
 */
public class CountDownLatchTest {
    public static CountDownLatch c = new CountDownLatch(4);
    public static void main(String [] args) throws InterruptedException {
        Thread t =new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(c.getCount()); //第1
                c.countDown();
                System.out.println(c.getCount());//第2
                c.countDown();
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(c.getCount());//第3
                c.countDown();
                System.out.println(c.getCount());//第4
            }
        });
        t.start();
        c.await(2, TimeUnit.SECONDS);
        c.countDown();
        System.out.println(c.getCount( ));//第5
    }
}

  输出结果如下:

Connected to the target VM, address: ‘127.0.0.1:55816‘, transport: ‘socket‘
4      第1
3      第2
1      第5
Disconnected from the target VM, address: ‘127.0.0.1:55816‘, transport: ‘socket‘
1      第3
0      第4

Process finished with exit code 0

  由于线程t沉睡时间大于CountDownLatch c的等待时间,所以线程t在主线证执行完毕后才结束的.

二:CyclicBarrier(指定线程数,必须在该线程数内的线程全部到达同步点,才继续往下执行)

示例代码:

package com.thread.ccse;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * Created by IntelliJ IDEA.
 * User: 周强
 * Description:
 * Date: 2017/8/9
 * Time: 21:30
 */
public class CyclicBarrierTest {

    static Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("3");
        }
    });

    static  Thread thread = null;
    public static CyclicBarrier c = new CyclicBarrier(2,t);
    static {
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    c.await();
                    System.out.println("1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void main(String [] args){

        thread.start();
        try {
            c.await();
            System.out.println("2");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

}

 执行结果:

Disconnected from the target VM, address: ‘127.0.0.1:56157‘, transport: ‘socket‘
3
2
1//其中,3 肯定是最先输出的,1 和 2 的输出顺序是不一定的 

Process finished with exit code 0

  

CountDownLatch和CyclicBarrier的区别:

CountDownLatch计数器只能使用一次,而CyclicBarrier的计数器可以使用多次,因为CyclicBarrier可以使用reset方法重置计数器;

CyclicBarrier还提供其它方法,如getNumberWating方法可以获得CyclicBarrier阻塞的线程数,isBroken方法可以用来了解阻塞的线程是否被中断。

三:

待续

时间: 2024-10-23 10:48:54

ccse(CountDownLatch,CycliBarrier,Semaplore,Exchanger)的相关文章

java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用

先来讲解一下Semaphore信号灯的作用:  可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面的演示代码: 1 public class SemaphoreTest 2 { 3 public static void main(String[] args) 4 { 5 //创建一个带有缓存的线程池 6 ExecutorService service = Executors.newCachedT

JDK5线程并发包使用整理

JDK5线程并发包 1)AtomicInteger 使用原子方式更新int值 2)创建线程池 a)创建固定大小的线程池 ExecutorService threadPool = Executors.newFixedThreadPool(10);//创建一个有10个线程的线程池 b)创建缓存线程池 Executors.newCachedThreadPool(); 创建一个可根据需要创建新线程的线程池,可自动调整线程的多少 c)创建单线程的线程池 Executors.newSingleThreadE

深入浅出 Java Concurrency (38): 并发总结 part 2 常见的并发场景[转]

常见的并发场景 线程池 并发最常见用于线程池,显然使用线程池可以有效的提高吞吐量. 最常见.比较复杂一个场景是Web容器的线程池.Web容器使用线程池同步或者异步处理HTTP请求,同时这也可以有效的复用HTTP连接,降低资源申请的开销.通常我们认为HTTP请求时非常昂贵的,并且也是比较耗费资源和性能的,所以线程池在这里就扮演了非常重要的角色. 在线程池的章节中非常详细的讨论了线程池的原理和使用,同时也提到了,线程池的配置和参数对性能的影响是巨大的.不尽如此,受限于资源(机器的性能.网络的带宽等等

Java 可中断线程

PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecation") public static void main(String[] args) throws Exception { Thread th = new Thread(new TestRunnable()); // 启动线程 System.out.println("main: start

JDK5.0 特性-线程同步装置之Semaphore

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html 1 import java.util.ArrayList; 2 3 import java.util.concurrent.ExecutorService; 4 5 import java.util.concurrent.Executors; 6 7 import java.util.concurrent.Semaphore; 8 9 import java.util.

java effective 读书笔记

java effective 读书笔记 [1]创建和销毁对象 1 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 2 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 3 枚举 singleton 不知道怎么操作,觉得意义不大 单例模式 4 私有化构造器不能实例化,也不可被子类继承 5 能用原生类的就尽量不用对象 [2]对于所有对象都通用的方法 reflexivity 自反性 symmetry 对称性 [3]类成员 降低可访问性 尽量把公有域 变成私有域,并提供

并发编程 知识点

1. Executor框架 2. Fork/join 3. happen-before 4. 数据结构 - ConcurrentHashMap - ConcurrentLinkedQueue 5. 线程池 - 参数设置 - 原理 - 拒绝策略 6. 线程状态 7. Lock/synchronized 8. 原子操作类 9. 并发工具类 - CountDownLatch - Semaphore - CuclicBarrier - Exchanger

Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c

Join,CountDownLatch,CyclicBarrier,Semaphore和Exchanger

CountDownLatch允许一个或者多个线程等待其他线程完成操作,之后再对结果做统一处理: 适用场景,分布式系统中对多个微服务的调用,并发执行并且必须等待全部执行完成才能继续执行后续操作: 其实在java中默认的实现是join()方法,join()方法主要的作用是当前线程必须等待直到join线程执行完成之后才能继续执行后续的操作, 其本质就是轮询判断join线程是否存活,如果存活则主线程继续等待,否则,通过调用this.notifyAll()方法来继续执行主线程. 实例代码如下: publi