在socket 通讯时候,程序退出时候,socket并未释放,这就导致socket线程被阻塞了
1、同步阻塞:
等待锁的释放
2、等待阻塞:
1、使用thread.sleep 造成的阻塞 结束后进入 RUNNABLE 状态
2、使用thread.wait 造成的阻塞,使用notify 或者notifyall 唤醒
3、使用thread.join 造成的阻塞,等待上一个线程进入RUNNABLE状态
4、使用thread.suspend 造成的阻塞,需要使用resum 来唤醒
5、使用LockSupport.park 造成的阻塞,使用LockSupport.unpark 来唤醒
6、使用LockSupport.parkNano 指定时间结束后,自动唤醒,LOockSupport.parkUtil 到达指定时间,自动唤醒
join,detch 区别
主线程和子线程 关系主要有两种:
1、joinable 主线程需要明确等待操作,子线程结束后,主线程的等待操作执行结束,主线程和子线程会合,主线程必须会合可会合的子线程。在主线程的线程函数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕,进入终止态,也必须执行会合操作,否则,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。
2、detchable 可分离 表示子线程无需和主线程会合,也就是相分离的,这种情况下,子线程一旦进入终止状态,这种方式常用在线程数较多的情况下,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是很困难或不可能的,所以在并发子线程较多的情况下,这种方式也会经常使用
区别;
1、join会导致主线程阻塞,等待子线程终止,然后主线程终止等待线程,继续运行
2、detch,主线程继续运行,子线程在后台运行,主线程无法获取子线程的控制权,主线程结束后,由运行库负责清理与子线程相关的资源