线程的优先级:
- 线程的等级:
MIN_PRIORITY:1
NORM_PRIORITY:5
MAX_PRIORITY:10 - 如何设置和获取优先级
getPriority:获取
setPriority(int priority):设置 - 调度策略:
高优先级的线程要抢占低优先级的策略。高优先级的线程只是从概率上来讲要比低线程更大概率的被执行,并不会完全一定优先于低线程执行
线程通信:
* 1. 线程通信涉及到三个方法:
* wait():当执行到此方法时,当前的线程就进入阻塞状态,同时释放对同步监视器的调用。需要被唤醒,才可以继续执行。
* notify():当执行到此方法时,就会唤醒被wait的一个线程。如果有多个被wait的线程,则唤醒优先级高的那个
* notifyAll():当执行到此方法时,就会唤醒所有被wait的线程。
*
* 2. 说明:
* ① wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中。不能在Lock中使用
* ② wait()、notify()、notifyAll()三个方法的调用者是同步监视器。否则,报java.lang.IllegalMonitorStateException
* ③ wait()、notify()、notifyAll()三个方法定义在java.lang.Object类中
*
例题:使用两个线程打印 1-100。线程1, 线程2 交替打印
public class CommunicationTest {
public static void main(String[] args) {
PrintNum p = new PrintNum();
Thread t1 = new Thread(p, "线程1");
Thread t2 = new Thread(p, "线程2");
t1.start();
t2.start();
}
}
class PrintNum implements Runnable {
private int number = 1;
private Object obj = new Object();
@Override
public void run() {
while (true) {
// synchronized (this) {
synchronized (obj) {//
obj.notifyAll();//唤醒被wait的线程
if (number <= 100) {
try {
Thread.sleep(20);//在同步结构中,执行此方法不会释放同步监视器
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
//让当前线程进入等待状态
try {
obj.wait();//在同步结构中,执行此方法会释放同步监视器
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
面试题:sleep()和wait()的异同?
* 相同点:一旦执行,都会使得当前线程结束执行状态,进入等待状态。
* 不同点: ① 定义方法所属的类:sleep():Thread中定义。 wait():Object中定义
* ② 使用范围的不同:sleep()可以在任何需要使用的位置被调用; wait():必须使用在同步代码块或同步方法中
* ③ 都在同步结构中使用的时候,是否释放同步监视器的操作不同:sleep():不会释放同步监视器 ;wait():会释放同步监视器
* ④ 结束等待的方式不同:sleep():指定时间一到就结束阻塞。 wait():需要被唤醒,进而结束阻塞。