JAVA多线程主要的内容在于 Thread类与Runnable接口
public void run()方法用于放置线程要运行代码
1.常用方法
(1)start() 启动线程
(2)sleep() 线程休眠,如果有参数,第一个参数为要休眠多少毫秒,第二个参数精确到要休眠到多少纳秒
(3)join() 没有参数,其他线程需要等待当前线程运行结束才能有机会运行,有参数则是等待多少时间才有机会运行。
(4)yieid() 使当前线程释放处理器的资源,并重新竞争处理器的资源
(5)currentThread() 返回当前正在运行的线程引用
2.详解
(1)线程的停止方法:
1.错误的停止方式
1.stop()方法:
原因:调用stop方法会导致当前线程戛然而止,线程后续的操作将无法进行,如果是是正在调用循环方法时,也会直接停止。这个方法已经被JAVA官方遗弃。
2.Interrupt()方法:
原因:该方法用于中断线程,并返回一个布尔值,在使用该方法中断线程时,如果线程中含有wait,sleep等方法,该方法会清除返回的值,并抛出一个interrupt的异常,在后续使用isiterrupt或者initerrupt方法判断停止线程时,并不能正常的停止线程。
2.正确的停止方式--使用停止标志:keepRunning
volatile关键字(可见性的)
volatile boolean keepRunning=true
在run方法中使用whlie(keepRunning)进行这样可以让线程在完成所有操作后,设置keepRunning=false就可以正确的停止。
(2)线程交互:
关键字:synchronized(同步的)用于放置要加锁的代码块。
1.线程的同步:线程之间的互相通信。
Wait Set:Wait Set区域对应着一个锁对象,每个锁对象都有一个Wait Set区域,当锁对象调用了wait方法时,当前线程就会被放入Wait Set区域中,在Wait Set中的线程不会去竞争CPU资源
wait():使当前线程释放身上的锁,并把当前线程放入Wait Set中
notify():唤醒在Wait Set中的某个线程
notifyAll()唤醒在Wait Set中的所有线程
2.线程加锁,用synchronized关键字对lockObj锁对象(Object类型)加锁,从而使整个代码块加上锁。(lockObj相当于整个代码的线程)
对线程加锁会有一定的性能开销,所以,为了避免线程再次竞争得到CPU资源而产生加锁的性能开锁,使用while循环阻挡,当条件不满足让线程重新进入等待状态。
网友评论