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());}}}
- java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()
- Java多线程-(5)线程的优先级、sleep()、yield()、join()
- java 多线程(1) join() / interrupt() 打断sleep() / stop() / run() / 线程停止的方法
- java的调度、优先级setPriority、yield、jion和守护线程setDaemon
- java个人学习笔记20(wait()和sleep()区别+停止线程+interrupt()+join()+setDaemon()+setPriority()+多线程常见写法)
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java多线程-线程状态、sleep()、yield()、join()
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- 黑马程序员——Java多线程—join、sleep、yield、后台线程、线程优先级
- [疯狂Java]多线程:线程控制(join、daemon、sleep、yield、优先级)
- 多线程—04—守护线程、interrupt、join、yield、线程优先级
- 多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();
- java---多线程sleep()和setPriority()方法
- java#4 控制线程(join),后台线程,线程睡眠(sleep),线程让步(yield),线程优先级
- ECMAScript 6入门
- g++编译
- 如何查看linux系统安装了哪些服务?
- AOP/OOP
- 再说MySQL数据库事务隔离级别的那些事(通俗版非学院派)
- java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()
- slidingMenu下的Viewpager滑动点击事件冲突
- UI组件之TextView及其子类(四)AnalogClock,DigitalClock
- iOS之UIGestureRecognizer_手势识别的简单用法
- DBUtils
- java中Object... 的用法是什么意思?
- 徐家骏:我在华为工作十年的感悟(转载)
- 并行原理分析(libcurl+epoll)
- 阅读《Android 从入门到精通》(10)——单项选择