如何控制线程的执行

阅读: 评论:0

如何控制线程的执行

如何控制线程的执行

文章目录

  • 时间片的概念
  • 注意事项
  • setPriority(int) : 设置线程优先级别
  • static sleep(long) : 让当前线程休眠指定的毫秒数~
  • static yield() : 让当前线程放弃已经持有的时间片 直接返回就绪状态**
  • join() : 让当前线程邀请另一个线程优先执行

时间片的概念

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。

注意事项

线程章节所有主动进入阻塞状态的方法 都需要进行异常处理
因为Ta们都有throws InterruptedException的声明 而这时一个非运行时异常 必须处理

线程章节所有的静态方法 不要关注谁调用方法 而要关注
调用出现在谁的线程体当中 出现在哪个线程体当中 就是操作哪个线程

setPriority(int) : 设置线程优先级别

可选范围1-10 默认优先级为5
线程优先级越高 代表抢到时间片的概率越高~

public class TestSetPriority{public static void main(String[] args){ThreadOne t1 = new ThreadOne();ThreadTwo t2 = new ThreadTwo();t1.setPriority(10);//个子高 抢到篮板球的概率高t2.setPriority(1);//你懂~t1.start();//t2.start();}
}
class ThreadOne extends Thread{@Overridepublic void run(){while(true){System.out.println("小明 去图书馆看书吗? 不!我还要打篮球");}}
}
class ThreadTwo extends Thread{@Overridepublic void run(){while(true){System.out.println("小明 去打篮球吗?不!我还要写小说拍电影~");}}
}

static sleep(long) : 让当前线程休眠指定的毫秒数~

public class TestSleep{public static void main(String[] args)throws Exception{EtoakThread et = new EtoakThread();et.start();et.sleep(5000);while(true){System.out.println("叶莉~");}}
}
class EtoakThread extends Thread{@Overridepublic void run(){try{sleep(5000);}catch(Exception e){e.printStackTrace();}while(true){System.out.println("姚明~");}}
}

static yield() : 让当前线程放弃已经持有的时间片 直接返回就绪状态**

public class TestYield{public static void main(String[] args){NumThread nt = new NumThread();CharThread ct = new CharThread();nt.start();ct.start();}
}
//并允许其它线程去运行 != 并执行其它线程
class NumThread extends Thread{@Overridepublic void run(){for(int i = 1;i<=26;i++){System.out.println(i);Thread.yield();}}
}
class CharThread extends Thread{@Overridepublic void run(){for(char c = 'a';c<='z';c++){System.out.println(c);Thread.yield();}}
}

join() : 让当前线程邀请另一个线程优先执行

在被邀请的线程执行结束之前 主动邀请别人的当前线程不再执行 一直阻塞

一个主动邀请别人的线程: 当前处于运行状态的线程 = join写在谁的线程体当中
被邀请优先执行的线程: 主动调用方法的那个线程

public class TestJoin{public static void main(String[] args)throws Exception{EtoakThread et = new EtoakThread();et.start();et.join(); //雷锋:主线程  被邀请:etfor(int i = 0;i<1000;i++){System.out.println("梦回吹角连营~");}}
}
class EtoakThread extends Thread{@Overridepublic void run(){for(int i = 0;i<1000;i++){System.out.println("醉里挑灯看剑~");}}
}

小总结

到现在为止 线程类的方法:
run() start() setPriority() sleep() yield() join()

小练习

《西游记》一个向往美好的和尚 与诸多动物一起旅游的故事~

故事涉及一堆线程:

有一个师傅线程 打印999次 “Only you 能伴我取西经…”
有一个猴哥线程 打印888次 “俺老孙来也~”
有一个八戒线程打印777次 “分行李吧 回高老庄”
有一个沙僧线程 打印666次 “大师兄不好了 师傅被妖怪抓走了~”

师傅天天逼逼叨很烦很烦 请将他的优先级设置为最低: setPriority(int);
猴哥想要给师弟们更多的表现机会于是前三次得到时间片都会主动放弃: yield();
八戒很懒 在执行操作之前要先休眠300毫秒: sleep(long);
沙僧很依赖猴哥 猴哥不死 他绝对不上: join();

答案在最后 先自己写哦~

public class BigOne{public static void main(String[] args){SF sf = new SF();sf.setPriority(1);sf.start();WK wk = new WK();wk.start();WN wn = new WN();wn.start();WJ wj = new WJ(wk);wj.start();}
}
class SF extends Thread{@Overridepublic void run(){for(int i = 0;i<999;i++){System.out.println("Only You 能伴我取西经~");}}
}
class WK extends Thread{@Overridepublic void run(){yield();yield();yield();for(int i = 0;i<888;i++){System.out.println("俺老孙来也~");}}
}
class WN extends Thread{@Overridepublic void run(){try{sleep(300);}catch(Exception e){e.printStackTrace();}for(int i = 0;i<777;i++){System.out.println("分行李吧 回高老庄~");}}
}
class WJ extends Thread{WK hg;public WJ(WK hg){this.hg = hg;}@Overridepublic void run(){try{hg.join();}catch(Exception e){e.printStackTrace();}for(int i = 0;i<666;i++){System.out.println("大师兄不好了 师傅被妖怪抓走了~");}}
}

本文发布于:2024-01-31 14:38:10,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668309129236.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23