java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()
2016-01-13 10:38
736 查看
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如下:
输出结果
程序2
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()); } } }
相关文章推荐
- 关于springMVC的下载图片
- java反射详解
- 使用Jackson来实现Java对象与JSON的相互转换的教程
- java 实现WebService 以及不同的调用方式
- java发邮件(1)
- JAVA线程同步辅助类Exchanger-交换
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
- java 解惑
- spring mvc 配置多个dispatcherservlet
- java多线程Future和Callable类示例分享
- java解惑
- 在java中常出现的异常和解决方法
- java发邮件(2)
- java中如何从远程主机(服务器)或本地加载jar文件
- spring JPA中对自定义实体的查询经验
- Spring Security笔记:使用BCrypt算法加密存储登录密码
- eclipsesvn总是提示输入密码?svn总是提示输入密码的解决!
- Spring MVC 通过@Value注解读取.properties配置内容
- eclipse中快捷键
- Java内存溢出详解