3、线程--线程调度

1、线程的优先级

Thread类提供了获取和设置线程优先级的方法
getPriority:获取当前线程的优先级
setPriority:设置当前线程的优先级
Java语言为线程类设置了10个优先级,分别使用1~10内的整数表示 ,整数值越大代表优先级越高。

每个线程都有一个默认的优先级,主线程的默认优先级是5。


Thread类定义的三个常量分别代表了几个常用的优先级:
MAX_PRIORITY::代表了最高优先级10
MIN_PRIORITY::代表了最低优先级1
NORM_PRIORITY::代表了正常优先级5


setPriority 不一定起作用,在不同的操作系统、不同的 JVM 上,效果也可能不同。

  操作系统也不能保证设置了优先级的线程就一定会先运行或得到更多的CPU时间。
  在实际使用中,不建议使用该方法

public class testYXJ extends Thread{
    @Override
    public void run() {
        for(int i = 0 ; i< 10;i++){
            System.out.println(Thread.currentThread().getName() +
                    "---" + i);
            
        }
    }
    
    public static void main(String[] args) {
        Thread t1 = new testYXJ();
        Thread t2 = new testYXJ();
        
        //查看线程的优先级
        System.out.println(t1.getPriority());//5
        System.out.println(t2.getPriority());//5
        
        //设置线程优先级
        t1.setPriority(MAX_PRIORITY);
        t2.setPriority(MIN_PRIORITY);
        
        t1.start();
        t2.start();
    }
}

2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。

  millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。

  sleep()平台移植性好。
 
3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。

  这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。
 
4、线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象

  把执行机会让给相同或者更高优先级的线程。
 
5、线程加入:join()方法,等待其他线程终止。

  在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态

  直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
 
6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。

  如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。

  选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。

   直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。

  被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;

  例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

  类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

猜你喜欢

转载自www.cnblogs.com/Mrchengs/p/10803051.html