一、线程简介

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并发编程的艺术》并发编程的基础(四)的更多相关文章

  1. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  2. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  3. Java并发编程的艺术读书笔记(1)-并发编程的挑战

    title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...

  4. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  5. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  6. Java并发编程的艺术(三)——volatile

    1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...

  7. java并发编程的艺术(一)---锁的基本属性

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  8. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  9. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  10. Java并发编程的艺术 记录(一)

    模拟死锁 package com.gjjun.concurrent; /** * 模拟死锁,来源于<Java并发编程的艺术> * @Author gjjun * @Create 2018/ ...

随机推荐

  1. 「Luogu P3078 [USACO13MAR]扑克牌型Poker Hands」

    本题有\(O(N)\)的优秀做法,但是因为在考场上不一定能想到,就来分享一种\(O(N\log_2N)\)的做法.虽然有点慢,但是可以过. 前置芝士 线段树:提高组及以上必备内容,不会的同学可以学习一 ...

  2. java垃圾回收学习

    经过一个晚上的努力终于完成了一个文件替换指定字符串的程序,但是由于我要替换的全站程序html文件太多, 所以eclipse下边老是在一个目录结束后报出java.lang.OutOfMemoryErro ...

  3. Centos7 更新配置为阿里源步骤

    一.yum更换配置源过程 1.备份原有的.repo源文件 首先需要将之前的源进行备份(一般重要的配置文件都需要有备份的意识) # 进入源配置目录 cd /etc/yum.repos.d # 创建备份文 ...

  4. Django 学习 之ORM聚合查询分组查询与F查询与Q查询

    一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...

  5. Hive的存储和MapReduce处理——数据清洗(Part3)

    日期:2019.11.17 博客期:118 星期日 这几天在写程序的时候虚拟机崩了,无语~所以重新从最初的状态开始配环境,重新整理之前的所有代码程序.

  6. Input输入框日期控件

    案例 https://pan.baidu.com/s/1i6BNLcT   密码:p77m

  7. windows索引服务

        windows索引服务是windows操作系统提供的桌面搜索引擎,通过预先创建索引来提高对硬盘上文件内容的搜索速度.以windows服务程序的方式运行. 一.工作方式 1.对指定路径下的文件创 ...

  8. python面向对象之元类

    目录 元类 造类 第一阶段 第二阶段 造对象 元类 元类(A) ---> 类(B) ---> 实例(C) 对于实例C而言,它是对象,它的类就是类B 对于类B而言,它其实也是对象,那它的类就 ...

  9. StringUtils工具类常用方法汇总:判空、转换、移除、替换、反转。

    Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方法总 ...

  10. 三 HTML框架标签

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...