Java多线程编程读书笔记(一)

此博客个人读书笔记,简单摘要部分重要内容,以备后续复习所用。纰漏之处,烦请指出。
第一章、多线程技能
重点掌握:
1.线程启动
2.线程暂停
3.线程停止
4.线程优先级
5.线程安全相关问题(后续拓展java容器的是否线程安全的整理)

一、概念:
1、进程:受操作系统管理的最基本运行单元
2、线程:在进程中独立运行的子任务
3、多线程的优点:最大限度的利用CPU的空闲时间进行处理其他的业务,多线程是异步的
4、实现多线程:
1.继承Thread类
2.实现Runnable接口
其中Thread类本身实现了Runnable接口,他们之间具有多态关系
5、使用多线程时,代码的运行结果与代码的执行顺序或者调用顺序是无关的,即线程的运行具有随机性。
Thread.start()是通知“线程规划器”,此线程已经准备就绪了,等待调用线程对象的run()。Thread.start()使线程进入准备状态,而Thread.run()则是使线程进入运行状态
6、java是单根继承,不允许多继承,所以在线程已经有一个父类时,就只能在实现Runnable接口。并且,Thread的构造函数中有两个构造函数Thread(Runnable target)和Thread(Runnable target,String name)可以传递Runnable接口,即构造函数支持传入一个Runnable接口的对象
7、自定义线程类中的实例变量针对其他线程有共享和不共享之分,共享变量:允许多个线程访问同一变量,会产生“非线程安全”的问题。
非线程安全:多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的现象,进而影响程序的执行流程
解决方法:采取同步方法(Synchronized关键字)
Synchronized关键字:可以在任意对象和方法上加锁,加锁的代码被称为“互斥区”/“临界区”
8、i–及System.out.println()方法会出现的异常
因为i–在某些JVM中会被分为三步执行:取得原有i,计算i-1,对i赋值。i– 本身就不是原子操作,虽然println()在内部是同步的,但是i–操作却是在进入println()之前发生的,所以会出现非线程安全问题的概率
二、各种方法
1、currentThread():返回代码段中正在被哪个线程调用的信息
2、isAlive():判断当前线程是否处于活动状态
活动状态:线程已经启动且尚未停止,线程处于正在运行或者准备开始运行的状态就可以认为线程是存活的
3、sleep():让正在执行的线程在指定的毫米内睡眠,正在执行的线程:this.currentThread()返回的线程/
4、getId():取得线程的唯一标识
5、停止线程:
java中有以下三种方法可以终止正在运行的线程:
1.使用退出标志,使线程正常退出。当run()执行完成后线程终止
2.使用stop()强行终止线程,但是stop()、suspend()、resume()都是被废弃的方法,会产生不可预料的结果
3.使用interrupt方法中断线程
6、interrupt():仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程。即interrupt()并没有停止线程
7、如何判断线程是否是停止状态:
this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置清除为false的功能,static方法
连续执行两次该方法,第二个方法的返回值永远是false,因为第一次调用已经清除了其中的中断标志,且第二次调用检验完中断状态前。
this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志,非static方法
8、可以停止的线程:
①、异常法:当调用interrupted(),返回值为true时,在if语句中抛出异常(throw new InterruptedException())
②、在沉睡中停止,在sleep的状态下停止某一线程,会进入catch语句,并且清除状态值,使其变为false
③、暴力停止stop(),但是使用stop()方法会抛出java.lang.ThreadDeath(),但该异常不需要显示捕捉,stop()强制停止线程,会使线程的某些工作做不完;会对某些锁定的对象进行解锁,导致数据不一致的问题!!!
④、使用return停止线程:结合interrupted()和return结合也可以实现停止线程的效果,this.interrupted()条件成立,返回true,if语句中直接return
总结:优先使用异常法停止线程,因为可以向上继续抛出异常,使线程停止的事件快速传播
9、暂停线程:
使用suspend()方法暂停线程,使用resume()恢复线程的执行
缺点:
①、使用不当(只暂停不恢复)会造成公共的同步对象的独占,其他线程都无法访问公共同步对象,所以将suspend()废弃
②、使用线程暂停恢复很容易出现因为线程暂停而导致数据不同步的情况
10、yield():使线程放弃当前CPU资源,将其让给其他的任务去占用CPU的资源,但放弃时间不确定。
11、线程优先级:
线程优先级高的线程会获得较多的CPU资源,CPU优先执行优先级较高的线程对象中的任务
setPriority()设定优先级:1-10
线程的优先级具有继承性,A线程启动B线程,则B线程的优先级和A相同

猜你喜欢

转载自blog.csdn.net/qzy313885531/article/details/78995208