读书笔记:java线程_3

1. 一个线程进入阻塞状态,可能有如下原因:
你通过调用 sleep(milliseconds) 使线程进入休眠状态,在这种情况下, 线程在指定的时间内不会运行。
你通过调用 wait( ) 使线程挂起。直到线程得到了 notify( ) notifyAll( ) 消息,线程才会进入就绪状态。
线程在等待某个输入 / 输出完成。

线程试图在某个对象上调用其同步控制方法,但是对象锁不可用。


2.调用sleep( )的时候锁并没有被释放,理解这一点很重要。另一方面,wait( )方法的 确释放了锁,这就意味着在调用wait( )期间,可以调用线程中对象的其他同步控制方法。 当一个线程在方法里遇到了对wait( )的调用的时候,线程的执行被挂起,对象上的锁被 释放。


3.wait( ), notify( ),以及notifyAll( )的一个比较特殊的方面是这些方法是基类 Object的一部分,而不是像Sleep( )那样属于Thread的一部分。


4.实际上,你只能在 同步控制方法或同步控制块里调用 wait( ), notify(
) notifyAll( ) (因为不用 操作锁,所以 sleep( ) 可以在非同步控制方法里调用)。如果你在非同步控制方法里调用 这些方法,程序能通过编译,但运行的时候,你将得到 IllegalMonitorStateException 异常,伴随着一些含糊的消息,比如 当前线程不是拥有者 。消息的意思是,调用 wait( ), notify( ) notifyAll( ) 的线程在调用这些方法前必须 拥有 (获取)对象的锁。

5.有时线程会阻塞,比如在等待输入的时候。这时,你可以使用Thread对象的interrupt( )方法来跳出阻塞代码。


6.线程的一个额外好处是它们提供了轻量级的执行上下文切换(大约 100 条指令),而不是 重量级的进程上下文切换(要上千条指令)。因为一个给定进程内的所有线程共享相同的 内存空间,轻量级的上下文切换只是改变了程序的执行序列和局部变量。进程切换(重量 级的上下文切换)必须改变所有内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值