这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧。

ExecutorService

线程池,用于创造和复用线程,他有几种模式。

我举一个自定义线程池数量的例子如下

ExecutorService service = Executors.newFixedThreadPool();

CountDownLatch

主要用于通知等待线程什么时候能够开始运作。CountDownLatch 一般作为一个线程的内部变量并且通过构造函数传入

在线程内某时间结束后,调用countdown方法就会自动-1,当countdown计数器为0时,等待的线程就能继续运作了

ExecutorService service = Executors.newFixedThreadPool();
CountDownLatch end = new CountDownLatch();
service.submit(new ThreadA( end ))
end.await();

CyclicBarrier

一般用于设置线程的一个集合点,使用方式同CountDownLatch方法,区别在于这个类的await需要线程等待内部计数器完全结束至0后才会继续工作。

当线程池内的线程较少时,则可能容易死锁。此外次计数器在线程内部可重复使用

CyclicBarrier barrier = new CyclicBarrier(10);
barrier.await();

Semaphore

一般用于设置排队机制,多线程协作时某个方法最多进入X个线程。用法与之前的相似,设置一个最大限制值,但在完成操作后需要手动进行释放。

        Semaphore semaphore = new Semaphore();
semaphore.acquire();
semaphore.release();

Future

此方法用于异步处理一些复杂的操作,直接上例子吧 通过实现Callable接口的call方法进行包装,异步进行处理,然后通过future的get方法进行回调。

public class TestForThread {

    public int getRes(){
try {
Thread.sleep(*);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ;
} @Test
public void fultrueTest() throws InterruptedException, ExecutionException {
ExecutorService service = Executors.newFixedThreadPool();
CountDownLatch end = new CountDownLatch();
Semaphore semaphore = new Semaphore();
Future<Integer> f = service.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
return new TestForThread().getRes();
}
}); System.out.println("keep on ");
System.out.println("get callable data");
int a;
try {
a = f.get(, TimeUnit.SECONDS);
System.out.println(a);
} catch (TimeoutException e) {
// TODO Auto-generated catch block
System.out.println("timeout");
}
System.out.println("end");
end.await();
} }

Exchanger

这个用于线程之间的交换,比如一个线程读一个线程写,这个类我想了一下可能是为了节省一个Map的空间吧。不需要通过新建一个Map来存放临时数据。

具体事例不给啦,查API很简单的。(主要是我记不住 - -)

JAVA并发-线程协作的更多相关文章

  1. Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition

    在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...

  2. Java 并发 线程同步

    Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...

  3. Java 并发 线程的优先级

    Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于 ...

  4. Java 并发 线程属性

    Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...

  5. Java 并发 线程的生命周期

    Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a)     New 新建 b)     Runnable 可运行 c)     Running 运行 (调用 ...

  6. 从JDK源码角度看java并发线程的中断

    线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...

  7. Java并发——线程间的等待与通知

    前言: 前面讲完了一些并发编程的原理,现在我们要来学习的是线程之间的协作.通俗来说就是,当前线程在某个条件下需要等待,不需要使用太多系统资源.在某个条件下我们需要去唤醒它,分配给它一定的系统资源,让它 ...

  8. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  9. Java并发——线程介绍

    前言: 互联网时代已经发展到了现在.从以前只考虑小流量到现在不得不去考虑高并发的问题.扯到了高并发的问题就要扯到线程的问题.你是否问过自己,你真正了解线程吗?还是你只知道一些其他博客里写的使用方法.下 ...

随机推荐

  1. Java-笔记1

    /* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编 ...

  2. 斯坦福大学3D模型库-The Stanford 3D Scanning Repository

    这里总是让人感觉有差距的地方!!! http://graphics.stanford.edu/data/3Dscanrep/

  3. ILSVRC2014检测总结

    ILSVRC 2014结束一段时间了.从下面的表格来看,基本都是RCNN的路子,但是这些牛队都做了改进.自己和人家比差的太远啊,努力. team results Spotlights and impr ...

  4. 2.vue脚手架项目配置

    1.更改网站名: index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  5. iOS 检测版本更新(02)

    iOS 检测版本更新 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bu ...

  6. 牛客小白月赛1 J おみやげをまらいました 【MAP】

    链接:https://www.nowcoder.com/acm/contest/85/J おみやげをまらいました!    蛙蛙还是给你带来了礼物.但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能 ...

  7. 转:mysql远程连接 Host * is not allowed to connect to this MySQL server

    在本机登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改为'%' ...

  8. RabbitMQ (1) 环境安装

    1.下载erlang, 设置系统的环境变量 下载地址:http://www.erlang.org/downloads ERLANG_HOME=D:\Program\erl9.3 Path = %ERL ...

  9. C++ 整型长度的获取 不同的系统

    不同的系统中,C++整型变量中的长度位数是不同的,通常,在老式的IBM PC中,int 的位数为16位(与short相同),而在WINDOWS XP,Win7,vax等很多其他的微型计算机中,为32位 ...

  10. js过滤和包含数组方法

    let data=[{'Linda':'apple'},{'Linda':'pear'},{'Linda':'apricot'},{'Linda':'peach'},{'Linda':'grape'} ...