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());
}
}
}