Java多线程基础知识(五)
一. Java中的13个原子操作类
在Jdk1.5中,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全的更新一个变量的方式。
1. 原子更新基本类型类
AtomicBoolean : 原子更新布尔类型
AtomicInteger : 原子更新整型
AtomicLong : 原子更新长整型
2. 原子更新数组
AtomicIntegerArray: 原子更新整型数组里的元素
AtomicLongArray:原子更新长整型数组里的元素
AtomicReferenceArray:原子更新引用类型数组里的元素
3. 原子更新引用类型
AtomicReference:原子更新引用类型
AtomicReferenceFieldUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记的引用类型
4. 原子更新字段类
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型
二. Java中的并发工具类
在Jdk1.5中,提供了几个非常有用的并发工具类,它们提供了一种并发流程控制手段。
1. CountDownLatch 等待多个线程完成
CountDownLatch允许一个或多个线程等待其他线程完成操作
package com.bochao.concurrency; import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { static CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) { new Thread(new Runnable() { @Override
public void run() { System.out.println(1);
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown(); System.out.println(2);
countDownLatch.countDown();
}
}).start(); try {
countDownLatch.await();
System.out.println(3);
} catch (InterruptedException e) {
e.printStackTrace();
} } }
2. CyclicBarrier 同步屏障
让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
package com.bochao.concurrency; import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; class A implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("之前触发的动作!");
}
} public class CyclicBarrierTest2 { static CyclicBarrier c = new CyclicBarrier(2, new A()); public static void main(String[] args) { new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
c.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(1);
}
}).start(); try {
c.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(2);
} }
CyclicBarrier应用场景
它多应用于使用多线程计算数据的场景,最后使用前置的主线程任务来统计合并计算结果。
CyclicBarrier 和 CountDownLatch的区别
1. CountDownLatch 的计数器只能使用一次
2. CyclicBarrier计数器可以使用reset()重置
3. Semaphore 控制并发线程数
用来控制同时访问特定资源的线程数量,它通过协调各个线程以保证合理的使用公共资源。
package com.bochao.concurrency; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; public class SemaphoreTest { private static final int THREAD_COUNT = 20; // 创建固定大小的20个线程池
private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT); // 信号量10个, 只允许并发执行10个线程
private static Semaphore semaphore = new Semaphore(10); public static void main(String[] args) { for(int i=0; i<THREAD_COUNT; i++){ threadPool.execute(new Runnable() { @Override
public void run() { try {
// 获取执行许可
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("指定特定代码!");
semaphore.release();
}
});
} threadPool.shutdown();
} }
一些比较有用的方法:
<1>. int availablePermits() :返回此信号量中当前可用的许可证数
<2>. int getQueueLength() :返回正在等待获取许可证的线程数
<3>. boolean hasQueuedThreads():是否有线程正在等待获取许可证
<4>. void reducePermits(int reduction):减少reduction个许可证,是个protected方法
<5>. Collection getQueuedThreads() :返回所有等待获取许可证线程集合,是个protected方法
4. Exchanger 线程间交换数据
Exchanger是一个用于线程间协作的工具类。可用于线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方线程。
package com.bochao.concurrency; import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ExchangerTest { private static final Exchanger<String> exgr = new Exchanger<String>(); private static ExecutorService threadPool = Executors.newFixedThreadPool(2); public static void main(String[] args) { threadPool.execute(new Runnable() { @Override
public void run() { String A = "A"; try {
exgr.exchange(A);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}); threadPool.execute(new Runnable() { @Override
public void run() { String B = "B";
try {
String A = exgr.exchange(B);
System.out.println("A录入数据:" + A);
System.out.println("B录入数据:" + B);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} }
Java多线程基础知识(五)的更多相关文章
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java 多线程基础(五)线程同步
Java 多线程基础(五)线程同步 当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题. 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了同步机制 ...
- Java多线程基础知识笔记(持续更新)
多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- JAVA多线程基础知识(一)
一. 基础知识 要了解多线程首先要知道一些必要的概念,如进程,线程等等.开发多线程的程序有利于充分的利用系统资源(CPU资源),使你的程序执行的更快,响应更及时. 1. 进程,一般是指程序或者任务的执 ...
- Java多线程基础知识总结笔记
本篇笔记记录一些在Java多线程编程中常见的关键字,比较简单和基础的就不写太详细了. 一.Thread类(其实也是应用了Runnable接口)和Runnable接口(只有一个run方法,应用该类必须重 ...
- Java多线程基础知识例子
一.管理 1.创建线程 Thread public class Main { public static void main(String[] args) { MyThread myThread = ...
- Java多线程基础知识(二)
一. Java线程具有6种状态 NEW 初始状态,线程被创建,但是还没有调用start方法. RUNNABLE 运行状态,java线程将操作系统中的就绪和运行两种状态笼统的称作进行中. BLOCKE ...
随机推荐
- python 遍历文件夹 文件
python 遍历文件夹 文件 import os import os.path rootdir = "d:\data" # 指明被遍历的文件夹 for parent,dirn ...
- BZOJ4527: K-D-Sequence 线段树
别人家的题解. #include<bits/stdc++.h> #define N 200005 #define M (l+r>>1) #define P (k<< ...
- Java数据库——PreparedStatement接口
PreparedStatement接口是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表中准备好了一条SQL语 ...
- HTML学习笔记——列表和table
1>有序列表.无序列表和自定义列表 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- $.ajax()引发的对Deferred的总结 (转)
传统的ajax写法: $.ajax({ url:"1.json", type:"get", success:function(data){}, error:fu ...
- sqlserver检测死锁;杀死锁和进程;查看锁信息
http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 ( ::)转载▼ 标签: sql 检测死 ...
- Struts2 中Parameters是如何获取值的
刚刚学习struts2的知识,在练习struts2的默认语言OGNL过程中,对于<p>parameters:<s:property value="#parameters.u ...
- Win7下Python2.7环境安装paramiko模块
Win7下Python2.7环境安装paramiko模块,经过安装并测试成功,整理文档如下: 1.下载安装Windows版本的Python2.7,我默认装在C:\Python27 我的python已经 ...
- 免费SSL证书Let’s Encrypt
由于我们公司测试环境使用的这个.自己没有亲手搭建使用,但是知道有这个东西.以后使用的话自己直接搞起. 连接文档:http://www.5icool.org/a/201512/a15271.html ...
- ASP.NET MVC WebGrid – Performing true AJAX pagination and sorting 【转】
ASP.NET MVC WebGrid – Performing true AJAX pagination and sorting FEBRUARY 27, 2012 14 COMMENTS WebG ...