1.有时候,线程也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个
线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的
线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。
2.每个 Java 程序都至少有一个线程— 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并
在该线程中调用程序的 main() 方法。
3.使用线程的一些原因:
· 使 UI 响应更快
· 利用多处理器系统
· 简化建模
· 执行异步或后台处理
· 在不阻塞整个程序的情况下,执行阻塞I/O
4.在某些情况下,使用线程可以使程序编写和维护起来更简单。比如一个仿真应用程序,您要在其中
模拟多个实体之间的交互作用。给每个实体一个自己的线程可以使许多仿真和对应用程序的建模大
大简化。
5.虽然线程可以大大简化许多类型的应用程序,过度使用线程可能会危及程序的性能及其可维护性。
线程消耗了资源。因此,在不降低性能的情况下,可以创建的线程的数量是有限制的。
尤其在单处理器系统中,使用多个线程不会使主要消耗 CPU 资源的程序运行得更快。
6.如果对象拥有一个线程,那么它应该提供一个启动该线程的start() 或 init() 方法,而不是
从构造器中启动它。
7.线程会以以下三种方式之一结束:
· 线程到达其run() 方法的末尾。
· 线程抛出一个未捕获到的 Exception 或 Error。
· 另一个线程调用一个弃用的 stop() 方法。弃用是指这些方法仍然存在,但是您不应该在新
代码中使用它们,并且应该尽量从现有代码中除去它们。
8.如果线程是由对 Thread.interrupt() 的调用而中断的,那么休眠的线程会抛出
InterruptedException,这样线程就知道它是由中断唤醒的,就不必查看计时器是否过期。
9.Thread.yield() 方法就象 Thread.sleep() 一样,但它并不引起休眠,而只是暂停当前线程片刻,这样其它线程就可以运行了。
10.垃圾收集线程和由 JVM 创建的其它线程等都是守护程序线程。
任何线程都可以变成守护程序线程。可以通过调用Thread.setDaemon() 方法来指明某个线程是守
护程序线程。您也许想要使用守护程序线程作为在程序中创建的后台线程,如计时器线程或其它延迟的事件线程,只有当其它非守护程序线程正在运行时,这些线程才有用。
11.Volatile 比同步(Synchronized)更简单,只适合于控制对基本变量(整数、布尔变量等)的单个实例的访问。
12.仅仅因为代码块由锁保护并不表示两个线程不能同时执行该代码块。它只表示如果两个线程
正在等待相同的锁,则它们不能同时执行该代码。
13.由于同步防止了多个线程同时执行一个代码块,因此性能上就有问题,即使是在单处理器系统上。
最好在尽可能最小的需要保护的代码块上使用同步。
14.volatile是同步的意思
15.编写synchronized块时,遵循的几个准则:
*使代码块保持简短
*不要阻塞。不要在synchronized 块或方法中调用可能引起阻塞的方法,如
InputStream.read()。
*在持有锁的时候,不要对其它对象调用方法。这听起来可能有些极端,但它消除了最常见的
死锁源头。
16.java.util.concurrent 是Java中专门处理并发的包。