线程优先级以及线程通信

线程的优先级:

  1. 线程的等级:
    MIN_PRIORITY:1
    NORM_PRIORITY:5
    MAX_PRIORITY:10
  2. 如何设置和获取优先级
    getPriority:获取
    setPriority(int priority):设置
  3. 调度策略:
    高优先级的线程要抢占低优先级的策略。高优先级的线程只是从概率上来讲要比低线程更大概率的被执行,并不会完全一定优先于低线程执行

线程通信:

 * 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():需要被唤醒,进而结束阻塞。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值