线程读书笔记
来源:互联网 发布:春晚 知乎 编辑:程序博客网 时间:2024/05/17 03:52
1. 写方法【requestStop】和读方法【stopRequested】都被同步了。如果读和写操作没有都被同步,同步就不会起作用。《Effective Java中文版 第二版 Page231》<v1.0>
public class StopThread{
private static boolean stopRequested;
private static synchronized void requestStop(){
stopRequested = true;
}
private static synchronized boolean stopRequested(){
return stopRequested;
}
public static void main(String[] args) throws InterruptedException{
Thread backgroundThread=new Thread(new Runnable){
public void run(){
int i=0;
while(!stopRequested())
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
下面看另一种实现同步的方法:
【虽然volatile修饰符不执行互斥访问,但它可以保证任何一个线程在读取该域的时候都将看到最近刚刚被写入的值:】
//cooperative thread termination with a volatile field
public class StopThread{
private static volatileboolean stopRequested;
public static void main(String[] args){
Thread backgroundThread =new Thread(new Runnable(){
public void run(){
int i=0;
while(!stopRequested)
i++
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested=true;
}
}
2:java中同步工具类:Semaphore【信号量】,cycleBarrier【可重用栅栏】,CountDownLatch【倒计数门闸锁】,Exchange 见优秀博客:http://blog.csdn.net/dlf123321/article/details/51382503
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。
当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行
- ackage cn.itcast.heima2;
- import java.util.concurrent.Exchanger;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ExchangerTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final Exchanger<String> exchanger = new Exchanger<String>();
- service.execute(new Runnable(){
- public void run() {
- try {
- String data1 = "zxx";
- System.out.println("线程" + Thread.currentThread().getName() +
- "正在把数据" + data1 +"换出去");
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)exchanger.exchange(data1);
- System.out.println("线程" + Thread.currentThread().getName() +
- "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- service.execute(new Runnable(){
- public void run() {
- try {
- String data1 = "lhm";
- System.out.println("线程" + Thread.currentThread().getName() +
- "正在把数据" + data1 +"换出去");
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)exchanger.exchange(data1);
- System.out.println("线程" + Thread.currentThread().getName() +
- "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- }
- }
- 线程 - 读书笔记
- 线程读书笔记
- 读书笔记--第十一章 线程
- 读书笔记: 线程安全性
- 读书笔记:java线程_1
- 读书笔记:java线程_2
- 读书笔记:java线程_3
- 【读书笔记】Java线程
- 线程管理读书笔记
- 线程同步基础读书笔记
- 【读书笔记】Java 线程
- java线程读书笔记(1)
- 线程的概念-操作系统读书笔记
- APUE读书笔记-第十一章 线程
- 读书笔记之安卓线程
- Java读书笔记之线程Stop
- c#线程安全之读书笔记
- Java中的线程池--读书笔记
- 机器学习第一个算法决策树(DecisionTree)
- Unity Shader 学习笔记(28) 噪声纹理、消融效果、水波效果、噪声雾效
- “自顶而下,逐步求精” 应用体会
- 根据两个数组元素个数一样,元素一样,那么两个数组一样,写一个实现。
- Angular 2-模板
- 线程读书笔记
- LBP简介(附opencv代码)
- T
- java新特性—枚举
- nginx配置负载均衡时,假如一台tomcat宕机如何处置?
- java (数组操作)
- leetCode-Merge Sorted Array
- MyBatis + spring boot 搭建web项目
- 用if else 完成成绩的分布