线程相关
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是非公平锁