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()方法判断返回是否中断
死亡:执行完任务后
- Java线程模型、线程状态 - 线程(1)
- java 线程1 线程分类
- Java线程教程1
- Java线程同步 1
- Java线程基础1
- Java线程(1)
- java线程1
- Java线程池-1
- JAVA线程同步(1)
- Java线程初步1
- Java线程笔记1
- java线程(1)
- java线程学习1
- 1-Java创建线程
- Java线程1:概述
- 学习JAVA--线程1
- Java线程1
- Java线程池(1)
- OpenCV 关于保存图片
- JQuery文件浏览器插件使用示例
- C++ 快速排序 递归实现
- jvm调优
- 表单集调用问题
- java线程(1)
- 第三周项目3-掌握有对象的程序结构
- jquery添加删除表格行
- 2014-03-11项目1掌握对象
- 在保全tiny6410功能的前提下运行自己的Qt4程序(上)
- linux磁盘管理
- ubuntu安装samba时session setup failed: NT_STATUS_LOGON_FAILURE
- .prg文件不存在,求助啊
- Javascript打开新窗口并设置简单界面