2019.08.19 JAVA中的Thread概念(二)

一.线程调度
1.Java对线程的调度方法:
对于同优先级线程,组成一个队列,以先进先出的方式抢占CPU资源
对于高优先级的线程,赋予优先的抢占式资源(但是也不是绝对的能够抢到)
2. 线程的优先级分为三个等级,为:

  • MIN _PRIORITY (1)
  • NORM_PRIORITY (5)
  • MAX_PRIORITY(10)

getPriority() :返回线程优先值,默认为5
setPriority(int newPriority) :改变线程的优先级,线程创建时继承父线程的优先级

3.方法

  • join(),线程加入
  • sleep(),线程睡眠
  • yield(),线程让步

二.解释

1.join():线程加入,当前线程阻塞,让加入的线程先运行。加入的线程运行完毕,当前线程变为就绪状态。

package thread;

public class Test1 {
		
	public static class MyThreadA extends Thread{		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("MyThreadA线程运行开始!");
			for(int i=0;i<5;i++){				
				System.out.println("子线程A:"+i);
			}
			System.out.println("MyThreadA线程运行结束!");
		}
	
		
	}

	public static class MyThreadB implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("MyThreadB线程运行开始!");
			for(int i=0;i<5;i++){		
				System.out.println("子线程B:"+i);
			}
			System.out.println("MyThreadB线程运行结束!");
		}	
	}
}

没加join()之前

public static void main(String[] args) {
	System.out.println(Thread.currentThread().getName()+"主线程运行开始!");
	Thread a=new MyThreadA();
	a.start();	
	Thread b=new Thread(new MyThreadB());
	b.start();
	try {
		a.join();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		b.join();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println(Thread.currentThread().getName()+"主线程运行结束!");

}

加了join()之后
Q:什么时候需要用到join()方法?
A:当向前线程需要用到子线程的结果的时候,可使用。

2.sleep((long millis):线程睡眠,释放cpu,让别的线程先调用,没有别的线程也要等待到睡眠时间到了之后重新排队。调用此方法要处理InterruptedException异常。

3.yield():线程让步,暂停当前正在执行的线程由运行状态变为就绪状态,把执行机会让给优先级相同或更高的线程。若队列中没有同优先级的线程,忽略此方法。但是让出cpu之后,并不会阻塞该线程,所以也有可能还是这个线程抢到了cpu。

public static class MyThreadA extends Thread{		
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("MyThreadA线程运行开始!");
		for(int i=0;i<5;i++){				
			System.out.println("子线程A:"+i);
			if(i==3){
				Thread.yield();
			}
		}
		System.out.println("MyThreadA线程运行结束!");
	}

	
}

此时B抢到cpu
运行情况:
第一种情况:A线程当执行到3时会将CPU时间让掉,这时B线程抢到CPU时间并执行。
第二种情况:A线程当执行到3时会将CPU时间让掉,这时A线程抢到CPU时间并执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值