读书笔记:java线程_3

来源:互联网 发布:淘宝联盟怎么一键生成 编辑:程序博客网 时间:2024/04/30 09:37
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 条指令),而不是 重量级的进程上下文切换(要上千条指令)。因为一个给定进程内的所有线程共享相同的 内存空间,轻量级的上下文切换只是改变了程序的执行序列和局部变量。进程切换(重量 级的上下文切换)必须改变所有内存空间。
原创粉丝点击