1. 请简述一下线程的 sleep()方法和 yield()方法有什么区别?
回答:
1sleep()方法给其他线程运行机会时不考虑线程的优先级, 因此会给低优先级的线程以运行的机会; yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
2 线程执行 sleep()方法后转入阻塞 (blocked) 状态, 而执行 yield()方法后转入就绪 (ready) 状态;
3 sleep()方法声明抛出 InterruptedException, 而 yield()方法没有声明任何异常;
4 sleep()方法比 yield()方法 (跟操作系统 CPU 调度相关) 具有更好的可移植性.
2. 请说出你所知道的线程同步的方法
答: wait(): 使一个线程处于等待状态, 并且释放所持有的对象的 lock.
sleep(): 使一个正在运行的线程处于睡眠状态, 是一个静态方法, 调用此方法要捕捉 InterruptedException 异常.
notify(): 唤醒一个处于等待状态的线程, 注意的是在调用此方法的时候, 并不能确切的唤醒某一个等待状态的线程, 而是由 JVM 确定唤醒哪个线程, 而且不是按优先级.
Allnotity(): 唤醒所有处入等待状态的线程, 注意并不是给所有唤醒线程一个对象的锁, 而是让它们竞争.
3. 请说明一下 sleep() 和 wait() 有什么区别?
答: sleep 是线程类 (Thread) 的方法, 导致此线程暂停执行指定时间, 把执行机会给其他线程, 但是监控状态依然保持, 到时后会自动恢复. 调用 sleep 不会释放对象锁.
wait 是 Object 类的方法, 对此对象调用 wait 方法导致本线程放弃对象锁, 进入等待此对象的等待锁定池, 只有针对此对象发出 notify 方法 (或 notifyAll) 后本线程才进入对象锁定池准备获得对象锁进入运行状态.
4. 请详细描述一下线程从创建到死亡的几种状态都有哪些?
答: 1. 新建( new ): 新创建了一个线程对象.
2. 可运行 ( runnable ): 线程对象创建后, 其他线程(比如 main 线程) 调用了该对象 的 start ()方法. 该状态的线程位于可运行线程池中, 等待被线程调度选中, 获 取 CPU 的使用权 .
3. 运行 ( running ): 可运行状态( runnable ) 的线程获得了 CPU 时间片( timeslice ) , 执行程序代码.
4. 阻塞 ( block ): 阻塞状态是指线程因为某种原因放弃了 CPU 使用权, 也即让出了 CPU timeslice , 暂时停止运行. 直到线程进入可运行( runnable ) 状态, 才有 机会再次获得 CPU timeslice 转到运行( running ) 状态. 阻塞的情况分三种:
(一). 等待阻塞: 运行 ( running ) 的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列 ( waitting queue ) 中.
(二). 同步阻塞: 运行 ( running ) 的线程在获取对象的同步锁时, 若该同步锁 被别的线程占用, 则 JVM 会把该线程放入锁池 ( lock pool ) 中.
(三). 其他阻塞: 运行 ( running ) 的线程执行 Thread . sleep ( long ms )或 t . join ()方法, 或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态. 当 sleep ()状态超时, join ()等待线程终止或者超时, 或者 I / O 处理完毕时, 线程重新转入可运行 ( runnable ) 状态.
5. 死亡 ( dead ): 线程 run (), main () 方法执行结束, 或者因异常退出了 run () 方法, 则该线程结束生命周期. 死亡的线程不可再次复生.
来源: http://www.bubuko.com/infodetail-3219207.html