java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码)

标签: java



本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组。

写在前面

花了一周时间阅读《java多线程编程核心技术》(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的github上,有兴趣的朋友可以到我的github下载。源码采用maven构建,多线程这部分源码位于java-multithread模块中。

  • 仓库地址:java-learning
  • git clone: git@github.com:brianway/java-learning.git

java多线程

基础知识

  • 创建线程的两种方式:1.继承Thread类,2.实现Runnable接口。具体两者的联系可以参考我之前的博文《java基础巩固笔记(5)-多线程之传统多线程》
  • 一些基本API:isAlive(),sleep(),getId(),yield()等。
    • isAlive()测试线程是否处于活动状态
    • sleep()让“正在执行的线程”休眠
    • getId()取得线程唯一标识
    • yield()放弃当前的CPU资源
  • 弃用的API:stop(),suspend(),resume()等,已经弃用了,因为可能产生数据不同步等问题。
  • 停止线程的几种方式:
    • 使用退出标识,使线程正常退出,即run方法完成。
    • 使用interrupt方法中断线程
  • 线程的优先级:继承性,规则性,随机性
    • 线程的优先级具有继承性. 如,线程A启动线程B,则B和A优先级一样
    • 线程的优先级具有规则性. CPU尽量倾向于把资源优先级高的线程
    • 线程的优先级具有随机性. 优先级不等同于执行顺序,二者关系不确定
  • java中的两种线程:用户线程和守护(Daemon)线程。
    • 守护线程:进程中不存在非守护线程时,守护线程自动销毁。典型例子如:垃圾回收线程。

比较和辨析

  • 某个线程与当前线程:当前线程则是指正在运行的那个线程,可由currentThread()方法返回值确定。例如,直接在main方法里调用run方法,和调用线程的start方法,打印出的当前线程结果是不同的。
  • interrupted()isInterrupted()
    • interrupted()是类的静态方法,测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
    • isInterrupted()是类的实例方法,测试Thread对象是否已经是中断状态,但不清楚状态标志。
  • sleep()wait()区别:
    • sleep()是Thread类的static(静态)的方法;wait()方法是Object类里的方法
    • sleep()睡眠时,保持对象锁,仍然占有该锁;wait()睡眠时,释放对象锁
    • 在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级;wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程
    • wait()必须放在synchronized block中,否则会在runtime时扔出java.lang.IllegalMonitorStateException异常
方法 是否释放锁 备注
wait wait和notify/notifyAll是成对出现的, 必须在synchronize块中被调用
sleep 可使低优先级的线程获得执行机会
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值