第2章 Java并行程序基础

  1. Thread.stop方法会立即终止线程,可能会导致数据不一致的情况,正确的结束线程的方法是在run方法中加上对终止标识的判断逻辑实现
  2. 线程中断不会使线程立即退出,而是给线程发送一个通知,告知目标线程有人希望你退出,接到通知后的处理由目标线程自行决定,有以下三个方法
    public void Thread.interrupt() // 中断线程,设置中断标志
    public boolean Thread.isInterrupted() // 判断是否被中断
    public static boolean Thread.interrupted() // 判断是否被中断,并清除当前中断状态
    
  3. 直接中断线程并不会让线程停止,必须自行加入中断检测逻辑,一些会抛出InterruptedException的方法,捕获异常后中断标识会清楚,如有需要必须自行中断重新设置中断标识Thread.currentThread().interrupt()
  4. 线程的协作可通过Object类提供的wait、notify、notifyAll这三个方法在synchronized代码块中实现(必须先获得目标对象的一个监视器,执行方法后释放),执行obj.wait()的线程A将会等待,直到在其他线程B中之行了obj.notify()后线程A才会被唤醒。如果一个线程调用了obj.wait(),那么它就会进入obj对象的等待队列,这个队列中可能有多个线程都在同时等待obj对象;当obj.notify()被调用时,就从等待队列中随机选择一个线程(非公平),并将其唤醒。Object类中的notifyAll方法会唤醒队列中所有等待的线程。
  5. 在主线程中调用t.join()会阻塞主线程直到线程t执行完毕,静态方法Thread.yield()使当前线程让出CPU,重新进行资源争夺,有可能会继续执行
  6. volatile修饰的变量用于标识变量在多线程环境中的易变性,JVM会将让线程发现该变量的实际值,但是他并不会影响变量操作的原子性,例如i++是非原子操作
  7. 可以将功能相同的线程放在同一个线程组中
  8. 守护线程主要是做一些系统性的服务,被守护的线程结束后,其守护线程也会立即终止,另外守护线程必须在start()之前设置才回生效
  9. 线程的优先级和操作系统有关,并非绝对的可预测调度情况
  10. synchronized有多种用法
    • 指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁
    • 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要活的当前实例的锁
    • 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁

你可能感兴趣的:(第2章 Java并行程序基础)