线程相关

2020-04-10  本文已影响0人  JasonHwang

1、线程状态

NEW 新建状态,线程创建且没有执行start方法时的状态

RUNNABLE 可运行状态,线程已经启动,但是等待相应的资源(比如IO或者时间片切换)才能开始执行,在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行

BLOCKED 阻塞状态,当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有, 则该线程进人阻塞状态,例如,当遇到synchronized或者lock且没有取得相应的锁,就会进入这个状态

WAITING 等待状态,当调用Object.wait或者Thread.join()且没有设置时间,在或者LockSupport.park时,都会进入等待状态。

TIMED_WAITING 计时等待,当调用Thread.sleep()或者Object.wait(xx)或者Thread.join(xx)或者LockSupport.parkNanos或者LockSupport.partUntil时,进入该状态

TERMINATED 终止状态,线程中断或者运行结束的状态

线程状态转变

2、sleep和wait方法的区别

slepp是Thread的静态方法用于暂停当前线程,必须有超时时间参数,超时时间一过线程会启动,不涉及线程间通讯,不释放对象锁,wait是Object方法,会释放对象锁,只能在同步代码中使用,只有其他线程调用notify或者notifyall通知当前线程时才能唤醒,也可以设定超时时间唤醒。

3、如何终止线程

1)设置标记跳出循环,正常跑完run方法

2)使用interrupte()方法,调用该方法后只是标记状态为true,需要处理,如果程序处在阻塞状态会抛出InterruptedException异常,在异常中处理退出线程

5、公平锁与非公平锁,synchronied是那种锁

两种锁都维护了一个链表用以保存的等待获取锁资源的线程

公平锁:在队列中依次取出线程,获取锁资源,所有线程都有机会

非公平锁:进入队列之前先竞争锁资源,锁被其他线程占有则进入队列排队,没有被占用则占有锁资源

synchronied是非公平锁

上一篇下一篇

猜你喜欢

热点阅读