《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/ ...
随机推荐
- JS原型与原型链继承的理解
一.原型 先从构造函数开始吧! 构造函数是什么?构造函数与其他函数唯一的区别在于调用方式不同.任何函数只要通过new来调用就可以作为构造函数,它是用来创建特定类型的对象. 下面定义一个构造函数 Fem ...
- springmvc常用注解详解
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- SystemVerilog for design 笔记(二)
转载请标明出处 1. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制 2.赋值可以是逻辑1 用法: reg ...
- 劫后余生--New Start
被搁置的计划 It was the best of times,it was the worst of times,it was the age of wisidom,it was the age o ...
- angular 自定义服务封装自定义http请求
在angular中将http请求,放置在一起封装成服务,可减少代码重复,方便使用 var ngpohttprest = angular.module('ngpohttprest', []); ngpo ...
- Linux/CentOS环境下如何安装和配置PhantomJS工作环境
PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...
- Python 之网络编程之socket(3)hashlib模块
hashlib模块 #hashlib 这个模块是一堆加密算法的集合体,哈希算法的加密方式不止一种 httpswww.cmd5.com md5解密 # 应用场景在需要效验功能时使用 用户密码的 ...
- requests---requests封装请求类型
我们在做自动化的时候,肯定是代码越简洁越好,代码重复量越少越好,这里呢,我们可以通过把requests的请求类型都封装起来,这样编写用例的时候可以直接进行请求 requests方法封装 我们通常用的最 ...
- 利用kali自带的msfvenom工具生成远程控制软件(木马)
2.生成一个简单的木马 3. 4. 5. 6.接下来生成的winx64muma.exe实际演示 7.将生成的winx64muma.exe在受害者机器上运行 8.在kali下输入msfconsole 9 ...
- Django的templates(模板)
目录 Django的templates(模板) 模板传值 模板过滤器 模板语法之标签 常用标签之for标签 常用标签之if标签 常用标签之with标签 自定义过滤器和标签 模板的继承和导入 模板的导入 ...