java线程(1)

来源:互联网 发布:在淘宝卖鞋需要多少钱 编辑:程序博客网 时间:2024/06/06 02:26

java自己的线程是抢占式的

协作式的任务不会自己去放弃控制,需要自己在任务中去让步

协作式的优点:上下文切换开销比抢占式低廉,并且线程数量无限制

而抢占式的不会自己去放弃控制,各个线程之间会互相抢占CPU,CPU会分时间片段给各个线程

 

大家都知道,jvm的垃圾回收机制会把没有被引用的对象在"该回收的时候"进行回收。

但是线程是比较特别的,在它的运行期间是不会被jvm所清理的

 

异常处理:必须在run方法中进行处理,不可以跨线程处理,如果回来只会与线程有关和main无关
现在run的异常可以通过setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)来给线程设置
Thread.UncaughtExceptionHandler需要实现uncaughtException(Thread, Throwable)
可以通过Thread直接设置默认的处理器

 

优先级:在run方法里写入,其他方法的话好处不多,最好使用THREAD.MAX_PRIORITY

 

比起进程切换上下文:线程是轻量级的只需要100来条指令,而进程是重量级的需要上千条指令

多线程缺点:
1.等待共享资源的时候性能降低(例如对同步的方法进行访问)
2.需要处理线程的额外CPU花费(例如线程上下文切换时间)
3.糟糕的程序设计导致不必要的复杂度(需要处理死锁等)
4.有可能产生一些病态行为,如饿死(等待IO操作)、竞争(对文件进行写操作)、死锁(互相占用对方的资源,没有良好的处理机制)、活锁(大家都运行自己的任务,但是整体无法完成)
5.平台不同导致不一致性(例如各个平台的优先级设置不同)

 

阻塞:调用sleep方法,阻塞一段时间;等待IO完成;进入同步的方法
                                                                                                                                      
挂起:是不分配CPU使用的阻塞状态;wait(),等待调用notify()和notifyall()方法或者signal()和signalAll();
曾经使用suspend()和resume()来阻塞和唤醒,可能会死锁;stop()不会释放锁

中断:只能中断阻塞的任务。当中断阻塞的任务会抛InterruptedException;不能中断I/O阻塞和同步阻塞。中断IO可以关闭底层操作的资源(部分不行,可以考虑用NIO)。中断同步阻塞的话只能用ReenTrantLock对象中的lockInterruptibly()这样是阻塞的可中断。
想要中断执行的线程,可以在里面多设置阻塞或者Thread.interrupted()方法判断返回是否中断

死亡:执行完任务后

0 0