多线程学习笔记(2)

in 四月桐花 with 0 comment

线程的调度

JVM的线程调度模型基本上是由操作系统决定的,调度模型分为两种:

  1. 分时调度模型: 系统平均分配CPU时间片,所有线程轮流占用CPU
  2. 抢占式调度模型: 系统根据线程优先级分配CPU时间片,优先级高的优先分配CPU时间片,如果优先级相同,则随机选择一个.
    JAVA使用的是抢占式调度模型
  3. 线程都有优先级
  4. 可以设置线程的优先级从1到10,数值越高,优先级越高
  5. 优先级高的线程代表获取CPU时间片的概率高,并非一定优先执行

线程的状态

JAVA的Thread类声明了一下六中状态:

 public enum State {
        NEW,// 新建
        RUNNABLE,// 可执行,包含操作系统的就绪,运行两种状态
        BLOCKED,// 阻塞
        WAITING,// 等待
        TIMED_WAITING,// 限时等待
        TERMINATED;// 终止
    }

Thread对象的主要方法:

     class ThreadA extends Thread
     {
         void run()
         {
             Thread threadb = new Thread("thread-b");
             threadb.start();
             threadb.join();
         }
     }

注意:
1. threadb.start()被调用时,才会执行阻塞ThreadA的实例.虽然直接调用join()方法并不会报错,但若threadb没有启动(start),自然也不会执行threadb的run()方法,这也就失去了意义.
2. join()方法允许传入时间参数(如:join(1000)),如果设置了时间ThreadA的实例会被设置为TIMED_WAITING状态,如果没有设置时间,则会被设置成WAITING状态.

其他

  1. BLOCKED状态:当因为获取不到锁而无法进入同步块时,线程处于BLOCKED状态.这种状态通常发生在同步代码块调用时,线程需要获取锁的时候.
  2. 进入BLOCKED状态、WAITING状态、TIMED_WAITING状态的线程都会让出CPU的使用权;另外,等待或者阻塞状态的线程被唤醒后,进入Ready状态,需要重新获取时间片才能接着运行。