线程合并join方法和出让CPUyield方法
2014-04-04 14:49
417 查看
1 关于join方法的意义,很多地方的表述为线程合并, 根据我的理解, 也可以解释为一个线程等待另一个线程执行结束后再继续执行.
例如在这个主线程中,我有一个名为MyThread的线程类的mythread实例, 我在主线程的某个阶段需要等待mythread执行结束再执行(可能需要利用mythread)的执行结果,
那么就需要在主线程需要等待的地方加入mythread.join(),语句,具体代码如下:
可以看到,本应并发执行的主线程和mythread,实际上等到mythread执行之后主线程的打印工作才开始.
再来看一个yield方法的例子.
这个例子中有两个MyThread对象,t1和t2 .
通过yield 方法, 让线程在某个条件时让出CPU. 从输出中可以看到, 当i被3整除时, 一个线程一定会切换到另一个线程
从t2和t1 开始并发开始,每次被3整除都会发生切换
例如在这个主线程中,我有一个名为MyThread的线程类的mythread实例, 我在主线程的某个阶段需要等待mythread执行结束再执行(可能需要利用mythread)的执行结果,
那么就需要在主线程需要等待的地方加入mythread.join(),语句,具体代码如下:
package test; import java.util.Date; public class jointest { public static void main(String[] args){ Thread mythread = new MyThread(); mythread.start(); try{ mythread.join(); }catch(Exception e){ } for(int i=0;i<10;i++){ System.out.println("---"+new Date()); } } } class MyThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.println(new Date()); try{ sleep(1000); }catch(InterruptedException e){ return; } } } }结果为:
Fri Apr 04 14:42:41 CST 2014 Fri Apr 04 14:42:42 CST 2014 Fri Apr 04 14:42:43 CST 2014 Fri Apr 04 14:42:44 CST 2014 Fri Apr 04 14:42:45 CST 2014 Fri Apr 04 14:42:46 CST 2014 Fri Apr 04 14:42:47 CST 2014 Fri Apr 04 14:42:48 CST 2014 Fri Apr 04 14:42:49 CST 2014 Fri Apr 04 14:42:50 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014 ---Fri Apr 04 14:42:51 CST 2014
可以看到,本应并发执行的主线程和mythread,实际上等到mythread执行之后主线程的打印工作才开始.
再来看一个yield方法的例子.
这个例子中有两个MyThread对象,t1和t2 .
通过yield 方法, 让线程在某个条件时让出CPU. 从输出中可以看到, 当i被3整除时, 一个线程一定会切换到另一个线程
package test; import java.util.Date; public class jointest { public static void main(String[] args){ MyThread t1 = new MyThread("t1"); MyThread t2 = new MyThread("t2"); t1.start();t2.start(); } } class MyThread extends Thread{ MyThread (String s){ super(s); } public void run(){ for(int i=1;i<=100;i++){ System.out.println(getName()+" "+i); if(i % 3 == 0){ //System.out.println("---"); yield(); } } } }
...
...
...//以上省略,t2尚未开始 t1 80 t1 81 t1 82 t1 83 t1 84 t1 85 t1 86 t1 87 t2 1 t2 2 t2 3 t1 88 t1 89 t1 90 t2 4 t2 5 t2 6 t1 91 t1 92 t1 93 t2 7 t2 8 t2 9 t1 94 t1 95 t1 96 t2 10 t2 11 t2 12 t1 97 t1 98 t1 99 t2 13 t2 14 t2 15 t1 100 t2 16 t2 17 t2 18 t2 19 t2 20 t2 21 t2 22 t2 23 t2 24 t2 25
从t2和t1 开始并发开始,每次被3整除都会发生切换
相关文章推荐
- Android - Activity切换
- 安卓版html5拨电话发短信链接这样写你知道吗?
- SQL语句实现不存在即插入,存在则increase某字段的功能insert into … on duplicate key update
- The Template Method Pattern 模板方法模式
- SLF4J 项目中 日志文件的处理
- java多线程学习(二)——wait/notify
- 【设计模式】门面
- ffmpeg+nginx建立rtmp服务器,播放摄像头流
- VS2010编译错误: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403的解决方法 .
- mysql关联更新表
- NDK: 处理用户交互事件
- 37个简单实用的Ubuntu快捷键
- jQuery学习第一课
- cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce
- maven2.0学习笔记
- jQuery学习第一课
- 精通JavaScript攻击框架:AttackAPI
- Google官方下拉刷新组件---SwipeRefreshLayout
- HDUOJ----2487Ugly Windows
- jQuery.noConflict();