线程
一、创建线程方法1:1、继承Thread类
2、重写run()方法
3、调用start()方法
创建线程方法2: 1、实现Runnable类
2、实现run()方法
3、创建Thread()
4、调用start()方法
二、线程状态(五种):线程调用start()启动后变成就绪状态,CPU分配,线程得到执行机会则调用run方法变成运行状态,当CPU把执行机会给其他线程时,当前线程则变成阻塞状态------单线程应用,同一时间CPU将时间片只给一个线程运行
--新建(New),调用start()
->就绪(Runnable)
->运行(Running)
->阻塞(Blocked),
死亡(Dead),run()方法运行完毕
三、常用方法:
Thread.activeCount():当前启动线程数
Thread.currentThread():获取当前正在运行线程
getId():获取线程唯一标识
getName():获取线程名字
setPriority():设置优先级1-10
getPriority():获得优先级
四、终止线程:
stop() 不推荐,可能造成内存泄漏。如果程序中有资源需要回收时,在回收之前调用过stop()方法则会导致程序毫无征兆的停止从而来不及回收相关的资源,导致程序可能会抛出安全异常
interrupt(),可能报异常,如果调用了sleep方法,会报异常,休眠被打断
正常中断方式:先判断isInterrupter是否是中断状态,然后调用interrupt()
通过标记结束(推荐结束方式)
五、守护线程,也称之为后台线程,主要为其他线程提供支持的后台型进程,如jvm中的GC,守护线程随着主线的结束而结束
setDaemon(true):设置当前线程为守护线程
六、Join线程:让Join线程执行完再执行其他线程
join()
七、死锁
同步块中出现死循环也可能会造成死锁,另一线程一直等待当前资源
多个线程在等待被对方线程占有的资源释放时处于一种死锁状态
八、wait()和sleep()的区别:wait方法是Object类中用于让当前线程对象处于等待状态的方法,wait方法不会主动唤醒休眠中的线程,除非其他对象调用notify或notifyAll方法时,此时被休眠的线程才会被唤醒,wait方法在使用时,当前线程必须持有当前对象监视器(结合synchronized使用),否则会抛出illegalMonitorStateException
Sleep是来自Thread类中的,能够将当前线程处于一定时间休眠状态,当时间达到后,线程会自动唤醒,sleep方法不需要线程对象持有当前的对象监视器