《Java并发编程的艺术》并发编程的基础(四)
一、线程简介
1.线程的概念
系统运行的最小单元
2.为何使用多线程
更好地利用系统资源(处理器多核心),提高响应速度。
3.线程的状态
NEW(创建状态) RUNABLE(运行状态,系统调度,争抢时间片) BLOCKED(阻塞状态,加了锁,其它线程获得到了锁) WATING(等待状态,wait()方法时,使用notify()唤醒) TIMED_WAITING(超时等待状态,线程sleep()时,) TERMINAL(线程终止)
关于wait和notify:
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Waiting(), "WaitingThread");
Thread thread2 = new Thread(new NotifyWaiting(), "NotifyWaitingThread");
thread.start();
TimeUnit.SECONDS.sleep(2);
thread2.start();
}
}
class Waiting implements Runnable {
@Override
public void run() {
synchronized (Waiting.class) {
try {
System.out.println("Current thread: " + Thread.currentThread().getName() + ",Waiting is waiting!");
Waiting.class.wait();
System.out.println("Current thread: " + Thread.currentThread().getName() + ",Waiting is notified!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class NotifyWaiting implements Runnable {
@Override
public void run() {
synchronized (Waiting.class) {
Waiting.class.notify();
System.out.println("Current thread: " + Thread.currentThread().getName() + ",Waiting is notified!");
}
}
}
结果:
Current thread: WaitingThread,Waiting is waiting!
Current thread: NotifyWaitingThread,Waiting is notified!
Current thread: WaitingThread,Waiting is notified!
wait方法会释放锁,sleep则不会
二、启动和终止线程
1.启动线程
1.构建线程
new Thread(); new Runable(); new Callable(); //Callable可以返回Future携带返回值
注意:最好给线程初始化名称,方便JVM分析。
2.启动线程
thread.start();
或者Excutors.new线程池,然后ExecutorService.submit或者excute
2.终止线程
终止线程最好使用一个volatile修饰的boolean开关去进行控制
三、线程之间的通信
1.volatile与synchronized关键字
多个线程共享一个变量的话,会在线程里有一个变量的拷贝,提升运行效率,而导致线程不安全,而 volatile 关键字让变量直接从共享内存中读写,保证变量的安全性,但是效率却降低了。
2.wait()与notify()
wait() 方法与锁对象一起使用,调用wait()方法会释放所对象。
wait()标准范式:
synchronized(对象A){
while(条件不成立) {
对象A.wait();
}
doSomething();
}
notify()标准范式:
synchronized(对象A){
改变条件;
对象A.notify();
}
解读:
(1)wait()方法块,获取锁对象A;
(2)wait()方法块,锁对象A调用wait()方法,释放锁,进入WAIT状态,方法块进入WAIT队列;
(3)notify()方法块,获取所对象A;
(4)notify()方法块,改变条件,wait()方法块处于WAIT状态;
(5)notify()方法块,对象A调用notify()方法,此时wait()方法块离开WAIT队列,进入对象A的阻塞队列中;
(6)notify()方法块释放锁,wait()方法块获得锁,继续执行方法块,doSomething();
3.Thread.join()
在线程A中执行线程B.join():要先执行完线程B终止之后才从线程B.join()返回。
四、线程应用实例
1.等待超时模式
伪代码:
public synchronized Object get(long mills) throws InterruptedException {
long future = System.currentTimeMillis() + mills;
long remaining = mills;
while(result == null && remaining > 0) {
wait(mills);
remaining = future - System.currentTimeMillis();
}
return result;
}
解读:在超时mills毫秒之后,返回结果;
2.适用
连接池(连接池超时),线程池(线程池等待超时)
《Java并发编程的艺术》并发编程的基础(四)的更多相关文章
- 读《Java并发编程的艺术》(一)
离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...
- Java并发编程的艺术读书笔记(2)-并发编程模型
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
- Java并发编程的艺术读书笔记(1)-并发编程的挑战
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...
- Java并发编程的艺术(三)——volatile
1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...
- java并发编程的艺术(一)---锁的基本属性
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- 《Java并发编程的艺术》留给自己以后看的笔记
<Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...
- Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...
- Java并发编程的艺术 记录(一)
模拟死锁 package com.gjjun.concurrent; /** * 模拟死锁,来源于<Java并发编程的艺术> * @Author gjjun * @Create 2018/ ...
随机推荐
- ubutun18 install ibus-pinyin
ref: https://www.cnblogs.com/asmer-stone/p/9069866.html Step1 $ sudo apt-get install ibus-pinyin
- iis下发布MVC网站
1.首先检查有没有安装iis,没有的话先安装iis 2. 3.选择应用程序池的时候看有没有asp.net 4.0 如果没有先安装. 首先以管理员身份打开“运行”输入cd C:\Windows\Micr ...
- Redis调用
Redis帮助类 using StackExchange.Redis; using System; using System.Collections.Generic; using System.Lin ...
- centos 访问win共享
yum install samba 安装samba (其实我们只用到samba里面的winbind以便我们能够用windows机器的名称找到该机器的网络地址,在下面叙述的过程会用到.而且也要确定在 w ...
- 十 Restful风格
1 restful风格化,url上的参数通过{}点符绑定,RequestMapping("item/{id}") 2 点位符参数名与方法参数名不一致时,通过@PathVariabl ...
- Acwing272 最长公共上升子序列
题目大意:给定两个大小为n的数组,让你找出最长公共上升子序列的长度. 分析:这是一个比较好的dp题,LIS和LCS两大经典线性dp问题相结合,简称LCIS. 代码(O(n*n*n)写法): #incl ...
- 十六、myeclipse导入别人项目报错java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServle异常
问题原因:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServle异常 我是把别人的源码项目直接导 ...
- 在Linux上安装Oracle服务的操作步骤
如题,将我在云服务器上安装Oracle服务的惨痛经历分享出来,期间查找的资料踩过的坑无数,希望对大家能有帮助 闲话少叙,直接开始 首先,由于服务器比较差,需要先设置swap 查看是否设置swap虚拟内 ...
- 厉害了!SpringBoot是如何动起来的!
程序入口 SpringApplication.run(BeautyApplication.class, args); 执行此方法来加载整个SpringBoot的环境. 1. 从哪儿开始? Spring ...
- ES6转换ES5
各大浏览器的最新版本,对 ES6 的支持可以查看kangax.github.io/es5-compat-table/es6/.随着时间的推移,支持度已经越来越高了,超过 90%的 ES6 语法特性都实 ...