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

来源:互联网 发布:单机游戏优化器 编辑:程序博客网 时间:2024/06/10 21:02

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,最高是10System.out.println("main 优先级 "+thread.getPriority() +"t1 优先级 "+t1.getPriority());try{System.out.println("before join "+thread.isInterrupted());//truet1.join(); //把t1 线程和当前线程合并,则这个相当于方法调用了,t1的run()就执行了,run()全都执行过后,再执行这句后面的语句}catch(InterruptedException e){ //一旦这个异常被捕获,Interrupted 标记被清除System.out.println("我是main,被interrupt");}System.out.println("after join "+thread.isInterrupted());//falsefor(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 优先级 10I am zi xianchengbefore join trueI am zi xiancheng            // 这里是由于zi xiancheng 的优先级高了,分得的时间片多了,才能优先一下子执行4个输出,这里是为了明显的显示结果I am zi xiancheng            // 以上这些结果,在interrupt 消除之后,就是random 的了,多次运行可能有不同结果,都是正常的I am zi xianchengI am zi xiancheng我是main,被interruptI am zi xianchengafter join falseI am zi xianchengI am main threadI am main threadI am main threadI am main threadI am main threadI am main threadI am main threadI am main threadI am main threadI am main threadI am zi xianchengI am zi xianchengI 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());}}}





0 0