读《Java线程编程》

    科技2022-08-11  95

    作者 : Paul Hyde

    1、不宜采用多线程的场合 (1)由于上下文切换占用CPU的时间周期 (2)例如一个电子邮件程序,每5分钟检查一次新邮件,不能每次都创建一个新线程来检查新邮件,让同一个线程来完成任务,每次查询之间休眠5分钟,效率更高

    2、第一个线程是“主”线程,是由Java虚拟机JVM创建的,由它启动应用程序,再由主线程创建第二个线程。

    3、新创建的线程可以在调用start()后的任意时刻开始执行(进入run方法),意味着执行start()之后的任何语句前,原始线程可能被交换出来。虽然每个线程执行它自己的语句顺序是已知的,但是语句在处理器上的实际执行顺序是不确定的,程序的正确性不应当依赖于某种特定的顺序。

    4、Thead t = Thead.currentThread(); 获取当前线程的引用

    5、线程的名字一般在启动线程前设置,但也允许为已经运行的线程设置名字,允许两个Thread对象有相同的名字,但应尽量避免,JVM启动的main线程也可以更改它自己的名字

    6、start()方法的api: public native synchronized void start()

    7、isAlive():public final native boolean isAlive()

    8、sleep()方法是静态的,它只将当前线程置于休眠

    9、run()方法不带任何参数、不返回任何值,不声明它抛出任何异常

    10、终端线程interrupt()抛出一个SecurityException(RuntimeException的一个子类)表示发出中断请求的线程没有权限中断其它线程

    11、sleep()抛出异常时,清除了中断标志

    12、使用Thread.interrupted()方法来检查当前线程的中断状态,并隐式重置为false public static boolean interrupted() 静态方法,不能在特定线程上调用, 只能报告调用它的线程中断状态

    13、利用标志位技术检查中断状态,并在必要时抛出InterruptedException,是一种其它线程终止长时间运行方法的理想途径。

    14、suspend()方法是JDK1.2淘汰方法,因为如果在不合适的时候挂起线程(如锁定共享资源时),可能会发生死锁条件

    15、JDK1.2淘汰了stop()方法,因为可能导致对象中数据的崩溃,线程终止时很少有机会执行清理工作,当在某个线程上调用stop()方法时,线程释放它当前持有的所有锁。

    16、默认时,当构建新Thread时,它的运行优先级与构建它的线程的优先级相同

    17、InputStream的read()方法一直阻塞到从流中读取了一个字节的数据为止,可以无限阻塞,不能指定超时时间

    18、不要滥用Thread.yield(),因为执行线程间的上下文切换可能导致过量的系统开销,尽量不要在1秒内调用Thread.yield方法超过5次

    19、当在应用程序中给线程分配优先级时,只给那些频繁阻塞(休眠、等待I/O)的线程分配较高的优先级,需要较多CPU时间的计算应当由中低等优先级线程来完成,确保处理器不会被独占,避免将优先级设置为Thread.MAX_PRIORITY,除非线程几乎在所有时间均阻塞,或者存活时间非常短

    20、在两个或更多线程访问的成员变量上使用volatile时,除非所有的线程都访问synchronized代码块内的变量,如果成员变量构建后保持为常量(只读),就没有必要声明为volatile

    21、在调用notify()/ wait()之前,线程必须获得该对象的对象级锁的排斥性访问权限

    22、作为防止早期通知的一般原则,应当将wait()语句放在while循环内部,这样一来,不管wait()语句返回的理由是什么,都可以确保只有满足适当的条件时,才继续执行删除

    23、管道既不是一个文件,也不是一个网络连接,而是内存中的一个结构,保存读之前所写入的数据。通常,管道有一个固定的容量,当管道充满容量时,试图写入更多的数据将导致阻塞,直到另一个线程从管道移走(读取)了一些数据后,才能解除阻塞。同样,管道为空时,试图从管道读取数据将被阻塞,一直到另一个线程写入数据为止

    24、ThreadLocal包含一个WeakHashMap的引用,它自动保存有键值对,JDK1.2中引入了弱引用Weak Reference。WeakHashMap利用弱引用自动删除已经消亡、并在其它所有地方取消引用的线程映射。在WeakHashMap中,查找键是Tread的引用,保存的值是一个ThreadLocal.Entry对象。ThreadLocal.Entry是ThreadLocal的一个内部类,ThreadLocal使用它来保存特定线程值。

    25、在Java中,所有线程都属于ThreadGroup类的一个实例,线程组Thread group拥有一个名字以及与它相关的一些属性,可以用于作为一个组来管理其中的线程。

    Processed: 0.127, SQL: 8