JAVA多线程基础

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循环阻挡,当条件不满足让线程重新进入等待状态。


你可能感兴趣的:(JAVA多线程基础)