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

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. Ubuntu 10.04上安装MongoDB

    MongoDB是一个可扩展.高性能的下一代数据库.MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系.文档可能由 以下几 部分组成:独立的基本类型属性.“内嵌文档”或文档数组 ...

  2. TryParse()的用法

    DateTime dt = new DateTime(); DateTime.TryParse(txtName.text.trim(),out dt); string str1 = dt.ToStri ...

  3. 记录表TABLE的使用详解

    定义记录表(或索引表)数据类型与记录类型相似,但它是对记录类型的扩展.它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表. 定义记录表类型的语法如下: 1 2 TYP ...

  4. LeetCode700. Search in a Binary Search Tree

    题目 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 4 / \ 2 ...

  5. 转 Ubuntu 下 vim 搭建python 环境 配置

    1. 安装完整的vim# apt-get install vim-gnome 2. 安装ctags,ctags用于支持taglist,必需!# apt-get install ctags 3. 安装t ...

  6. Salt-ssh 自动安装salt-minion

    作用:为了不手动去安装一台一台去salt-minion,并进重复的配置 一.环境 系统环境: #cat /etc/redhat-release CentOS Linux release 7.4.170 ...

  7. php生成微信小程序二维码源码

    目前有3个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口.第一步:获取   access_token public function getWxAccessToken(){ $appid ...

  8. Makefile (1) gcc基础

    .c(源文件) --> .i(预处理文件) -->.s(汇编文件) --> -o(目标文件) -->可执行文件 ​ .c --预处理-->.i .i --编译--> ...

  9. mybatis在where中比较复杂的判断

    <if test="param.applicationStateInNumber != null and param.applicationStateInNumber != ''&qu ...

  10. POJ:3685-Matrix

    Matrix Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 7879 Accepted: 2374 Description Gi ...