我是靠谱客的博主 友好战斗机,最近开发中收集的这篇文章主要介绍java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority(),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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





最后

以上就是友好战斗机为你收集整理的java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()的全部内容,希望文章能够帮你解决java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部