您的位置:首页 > 编程语言 > Java开发

复习 Core Java Chap14 多线程 笔记

2014-09-29 03:30 387 查看
14.2 中断线程

在早期的 Java 版本中有 stop 和 suspend 方法,但是已经弃用。

interrupt 方法可以用来请求终止线程。每一个线程都有一个 boolean 的中断状态标志,使用 interrupt 可以把这个标志设为 TRUE。想要知道中断状态标准是否被设置,首先调用静态的 Thread.currentThread 获得当前运行的线程:

while (!Thread.currentThread().isInterrupted() && ...) {
...
}


如果线程是 blocked 的,就不能检测中断状态。会产生 InterruptedException。这个blocked 线程也就因此而中断了。

对于 interrupt 的请求,该线程不一定会终止。interrupt 只是提出一个请求,引起线程的注意,至于如果处理是由线程决定的。

14.3 线程状态

new, runnable, blocked, waiting, time_waiting, terminated

关于线程阻塞中的 sleep 和 wait 的区别:

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;

sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。

在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;

wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。

wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。

14.4.2 守护线程 daemon

通过调用 t.setDaemon(true) 将一个线程设置为守护线程。守护线程没有什么神奇的,它们用来给其他线程提供服务。当虚拟机中只剩下守护线程,虚拟机就会退出。

14.5.6

Do two synchronized methods execute simultaneously?

If t1 access the m1 method (synchronized method), could t2 thread access m2 method (synchronized method) simultaneously?

No. Only one thread can hold the lock of the object. And then it's only that thread that can enter the synchronized methods on that object.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: