复习 Core Java Chap14 多线程 笔记

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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值