一.线程调度
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线程运行结束!");
}
}
}
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()+"主线程运行结束!");
}
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线程运行结束!");
}
}
运行情况:
第一种情况:A线程当执行到3时会将CPU时间让掉,这时B线程抢到CPU时间并执行。
第二种情况:A线程当执行到3时会将CPU时间让掉,这时A线程抢到CPU时间并执行。