JAVA并发-线程协作
这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧。
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并发-线程协作的更多相关文章
- Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- Java 并发 线程同步
Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...
- Java 并发 线程的优先级
Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于 ...
- Java 并发 线程属性
Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...
- Java 并发 线程的生命周期
Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a) New 新建 b) Runnable 可运行 c) Running 运行 (调用 ...
- 从JDK源码角度看java并发线程的中断
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...
- Java并发——线程间的等待与通知
前言: 前面讲完了一些并发编程的原理,现在我们要来学习的是线程之间的协作.通俗来说就是,当前线程在某个条件下需要等待,不需要使用太多系统资源.在某个条件下我们需要去唤醒它,分配给它一定的系统资源,让它 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java并发——线程介绍
前言: 互联网时代已经发展到了现在.从以前只考虑小流量到现在不得不去考虑高并发的问题.扯到了高并发的问题就要扯到线程的问题.你是否问过自己,你真正了解线程吗?还是你只知道一些其他博客里写的使用方法.下 ...
随机推荐
- Java-笔记1
/* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编 ...
- 斯坦福大学3D模型库-The Stanford 3D Scanning Repository
这里总是让人感觉有差距的地方!!! http://graphics.stanford.edu/data/3Dscanrep/
- ILSVRC2014检测总结
ILSVRC 2014结束一段时间了.从下面的表格来看,基本都是RCNN的路子,但是这些牛队都做了改进.自己和人家比差的太远啊,努力. team results Spotlights and impr ...
- 2.vue脚手架项目配置
1.更改网站名: index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- iOS 检测版本更新(02)
iOS 检测版本更新 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bu ...
- 牛客小白月赛1 J おみやげをまらいました 【MAP】
链接:https://www.nowcoder.com/acm/contest/85/J おみやげをまらいました! 蛙蛙还是给你带来了礼物.但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能 ...
- 转:mysql远程连接 Host * is not allowed to connect to this MySQL server
在本机登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改为'%' ...
- RabbitMQ (1) 环境安装
1.下载erlang, 设置系统的环境变量 下载地址:http://www.erlang.org/downloads ERLANG_HOME=D:\Program\erl9.3 Path = %ERL ...
- C++ 整型长度的获取 不同的系统
不同的系统中,C++整型变量中的长度位数是不同的,通常,在老式的IBM PC中,int 的位数为16位(与short相同),而在WINDOWS XP,Win7,vax等很多其他的微型计算机中,为32位 ...
- js过滤和包含数组方法
let data=[{'Linda':'apple'},{'Linda':'pear'},{'Linda':'apricot'},{'Linda':'peach'},{'Linda':'grape'} ...