Java多线程学习笔记
记录一下时间,第一次为2019/07/16,传说多线程为java核心,终于有时间来学习一下了。该笔记参考书籍为《java多线程编程核心技术》。
技能
这一张讲了很多琐碎点,也可以参照jdk源码理解,Thread类的核心方法很多,着重掌握以下内容:
- 线程的启动
- 如何使线程暂停
- 如何使线程停止
- 线程的优先级
- 线程的安全相关问题
-
进程与线程的概念
进程–操作系统管理的基本单元;
线程–组成进程的部分,如QQ中的文件管理,表情发送等
至于更多的区别请查阅操作系统一书。
线程被调用的时机是随机的,多线程是异步的。 -
使用多线程
实现多线程的方式有两种,一种是继承Thread类,另一种是实现Runnable接口。
public class Thread implements Runnable
在使用多线程的时候,代码的运行结果与代码的执行顺序或者调用顺序无关。
Thread的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。
如果调用thread.run()方法,就是同步调用,是顺序执行代码的。执行start()的顺序不代表线程的启动顺序。
synchronized可以在任意对象及方法上加锁,而加锁的代码块成为“互斥区”或“临界区”。
println()方法在内部是同步的,但是println(i–);却不是,因为i–是在进入println()之前发生的。
public void println(String x){ synchronized(this){ print(x); newLine(); } }
-
currentThread()方法
currentThread为静态方法,指向的是当前上下文的线程。
-
isAlive()方法
判断当前对象线程是否处于活动状态。
-
sleep()方法
该方法是让正在执行的线程休眠(暂停执行)指定的毫秒数。
“正在执行的线程”是指this.currentThread()返回的线程。 -
getId()方法
用于获取线程的唯一标识。
-
停止线程
Thread.stop()方法不应该使用,因为是不安全的。,应该使用Thread.interrupt()方法。
Thread.interrupt()方法仅仅是在当前的线程中做了标记,并不是真的停止线程。判断线程停止状态的方法
方法名 是否为静态方法 执行对象 清除状态 this.interrupted() 是 当前线程 将状态标志清除为false this.isInterrupted() 否 测试线程 不清除 有很多种停止线程的方法,如异常法,沉睡中停止,
暴力停止(stop),return停止。
-
异常法(主推):使用interrupted()函数检测,停止时,抛出异常。
-
沉睡中停止:线程在sleep状态下停止,会抛出异常,清除状态。一定要先沉睡,再interrupt();若相反的话,线程会先停止,遇见sleep后再抛异常。
-
return:与异常法相似,不推荐该方法,会显得程序很乱。
-
暂停线程
暂停方法:
suspend;
恢复方法:resume;
缺点:
-
独占:使用不当,会造成对公共对象的无法访问;
-
不同步:多线程会造成数据的不同步
-
废弃:这组方法已经被废弃。
-
yield方法
放弃当前cpu资源,放弃的时间不确定。
-
线程的优先级
优先级较高的线程得到的cpu资源较多。
private final static int MIN_PRIORITY = 1 private final static int NORM_PRIORITY = 5 private final static int MAX_PRIORITY = 10
线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。
高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。
-
守护线程
本章结尾
-
线程的启动
thread.start()方法
-
如何使线程暂停
推荐wait()和notify()方法,尽量使用并发类框架 -
如何使线程停止
异常法 -
线程的优先级
最小在,最大,正常 -
线程的安全相关问题
stop,suspend,resume方法都不要使用,做好共享资源的同步;