java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()

时间:2022-07-14 23:30:27

java Thread  线程的调度和优先级

sleep(),会抛出InterruptedException  异常,

join(),程序1,会抛出InterruptedException  异常,意思是合并线程,不并行执行了。相当于函数调用,谁调用这个,谁的run( ) 方法优先执行,直到执行后,再执行这个语句 ( 所在线              程未知,但不是当前的) 后面的语句。

interrupt(),程序1,谁调用interrupt(),谁 ( 比如thread 对象) 的isInterrupted() 返回true,如果thread 的流程中有捕获 InterruptedException 异常的,比如join( ) 或 sleep()函数,则

                      这种函数被打断,抛出InterruptedException 异常,并且isInterrupted()  被置为false,继续执行catch 语句块后面的语句。

yield()  程序2 :yield() 做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的                              轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
                             yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。(这句是引用他人的话)

setPriority( )   :优先级越高,得到的CPU的时间片就会越多,范围从1到10,默认的是5

程序1如下:

package test.java.Thread;

public class TestYield {

public static void main(String[] args) {
Thread thread = Thread.currentThread();
MyThread3 t1 = new MyThread3("zi xiancheng",thread);
thread.setPriority(5);
t1.setPriority(10);
t1.start();//最低优先级是1,最高是10
System.out.println("main 优先级 "+thread.getPriority() +"t1 优先级 "+t1.getPriority());
try{
System.out.println("before join "+thread.isInterrupted());//true
t1.join(); //把t1 线程和当前线程合并,则这个相当于方法调用了,t1的run()就执行了,run()全都执行过后,再执行这句后面的语句
}catch(InterruptedException e){ //一旦这个异常被捕获,Interrupted 标记被清除
System.out.println("我是main,被interrupt");
}
System.out.println("after join "+thread.isInterrupted());//false
for(int i=0;i<10;i++)
System.out.println("I am main thread");
}

}

class MyThread3 extends Thread {
public Thread thread = null;

MyThread3(String s, Thread thread){// 这个参数是线程名字,没什么用,可以作为一个标识,由本线程的getName()方法去调用
super(s);
this.thread = thread;
}

public void run(){
thread.interrupt();//只是给thread 这个线程一个标志位而已,不做动作。但是会让sleep 等函数抛出异常。平时可以通过这个异常也可以通过
for(int i=0;i<10;i++){ //thread.isInterrupted() 这个标志位来控制thread这个线程的动作
System.out.println("I am "+getName());
//try{
//sleep(1);
//}catch(InterruptedException e){
//return ;
//}
}
}
}

输出结果

main 优先级 5  t1 优先级 10
I am zi xiancheng
before join true
I am zi xiancheng // 这里是由于zi xiancheng 的优先级高了,分得的时间片多了,才能优先一下子执行4个输出,这里是为了明显的显示结果
I am zi xiancheng // 以上这些结果,在interrupt 消除之后,就是random 的了,多次运行可能有不同结果,都是正常的
I am zi xiancheng
I am zi xiancheng
我是main,被interrupt
I am zi xiancheng
after join false
I am zi xiancheng
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am main thread
I am zi xiancheng
I am zi xiancheng
I am zi xiancheng


程序2

public static void main(String[] args) throws InterruptedException {
MyThread3 t1 = new MyThread3("t1");
MyThread3 t2 = new MyThread3("t2");
t1.setPriority(5);
t2.setPriority(5);
t1.start();
t2.start();
}

}

class MyThread3 extends Thread {
MyThread3(String s ){// 这个参数是线程名字,没什么用,可以作为一个标识,由本线程的getName()方法去调用
super(s);
}

public void run(){
for(int i=0;i<=100;i++){
System.out.println(getName()+": "+i);
if(i%10==0){
//System.out.println("yield之前"+getName()+": "+getState());
yield();// 用的不是特别多,但是要理解,他是让出cpu 让其他线程执行
//System.out.println("yield之后"+getName()+": "+getState());
}
}
}