thread 中join() 的用法
2015-06-03 11:54
323 查看
前段时间参加面试时,被一个面试官问到thread中join方法用法,那会自己答得有点唐突吧,面试官对我的回答好像不是很满意!
最近有点小空闲,就稍微看了一些书,然后自己整理了一下线程中几个方法的用法:
1.首先来说说线程Thread的Join方法:
join方法顾名思义 就是往线程中添加东西的;join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。
看一下一个demo:
one------0
one------1
one------2
one------3
one------4
two------0
two------1
two------2
two------3
two------4
主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。 活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来;这就是调用join方法的用法。
2.看下sleep、yield方法:
Thread.yield()方法暂停当前正在执行的线程对象,并执行其他线程。也就是交出CPU一段时间(其他同样的优先级或者更高优先级的线程可以获取到运行的机会);不会释放锁资源。
而Thread.sleep()方法使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行, 同时sleep函数不会释放锁资源;sleep可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。
这两个的区别在于yield只能是同级,或者高级优先执行,而sleep可以低级,同级都可以有优先执行机会。
看以下两个demo
3.wait(),notify()方法
顺便说下Object 类的wait()方法和notify()方法,注意这个不是Thread类的方法;还有这两个方法主要是操作锁标志的,所以只能在synchronized方法或者synchronized block中
使用;wait()方法在睡眠的时候会放开锁,给其他的线程使用。wait()有两种方式获得锁:1.wait(longtimeout),通过设定时间来获得锁,值得注意的是,timeout这个时间到了以后,它不会立即醒来,而是要看那个正在使用这把锁的线程是否结束。2.通过notify()的方法,通知需要这把锁的wait(),使之唤醒,还有wait 方法也要和sleep方法区别,上面说到sleep方法是不释放锁资源的。
最近有点小空闲,就稍微看了一些书,然后自己整理了一下线程中几个方法的用法:
1.首先来说说线程Thread的Join方法:
join方法顾名思义 就是往线程中添加东西的;join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。
看一下一个demo:
/** * join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件, * 我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。 * @author leo-zeng * */ public class JoinTest { public static void main(String[] args) throws Exception { ThreadTest test =new ThreadTest(); ThreadTest test2 =new ThreadTest(); test.setName("one"); test2.setName("two"); Thread t1 = new Thread(test); Thread t2 = new Thread(test2); t1.start(); /** * 主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。 * 这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。 * 活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来 */ //join 方法 确保 t1执行之后 执行t2 t1.join(); t2.start(); } } class ThreadTest implements Runnable{ private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(this.getName()+"------"+i); } } }运行结果:
one------0
one------1
one------2
one------3
one------4
two------0
two------1
two------2
two------3
two------4
主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。 活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来;这就是调用join方法的用法。
2.看下sleep、yield方法:
Thread.yield()方法暂停当前正在执行的线程对象,并执行其他线程。也就是交出CPU一段时间(其他同样的优先级或者更高优先级的线程可以获取到运行的机会);不会释放锁资源。
而Thread.sleep()方法使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行, 同时sleep函数不会释放锁资源;sleep可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。
这两个的区别在于yield只能是同级,或者高级优先执行,而sleep可以低级,同级都可以有优先执行机会。
看以下两个demo
public class YieldTest { public static void main(String[] args) { ThreadTest2 test1 = new ThreadTest2(); test1.setName("one"); ThreadTest2 test2 = new ThreadTest2(); test2.setName("two"); Thread t1 =new Thread(test1); Thread t2 =new Thread(test2); t1.setPriority(Thread.MAX_PRIORITY); t2.setPriority(Thread.MIN_PRIORITY); t1.start(); t2.start(); } } class ThreadTest2 implements Runnable{ private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public void run() { for (int i = 0; i <10; i++) { Thread.yield(); System.out.println(this.getName()+"------"+i); }; } }如果不用yield()方法的话,两个线程应该是交替进行的,用了yield()之后,cpu会多交出一些时间给ti优先执行。
*/ public class SleepTest { public static void main(String[] args) { ThreadTest3 test2 = new ThreadTest3(); ThreadTest3 test3 = new ThreadTest3(); Thread t1 =new Thread(test2); Thread t2 =new Thread(test3); t1.setPriority(Thread.MAX_PRIORITY);//设置最高级别 t2.setPriority(Thread.MIN_PRIORITY);//设置最低级别 t1.start(); t2.start(); } } class ThreadTest3 implements Runnable{ @Override public void run() { for (int i = 0; i <10; i++) { try { Thread.sleep(100); System.out.println(Thread.currentThread().getName()+"------"+i); } catch (InterruptedException e) { e.printStackTrace(); } }; } }使用sleep的话,随机性就大一些。
3.wait(),notify()方法
顺便说下Object 类的wait()方法和notify()方法,注意这个不是Thread类的方法;还有这两个方法主要是操作锁标志的,所以只能在synchronized方法或者synchronized block中
使用;wait()方法在睡眠的时候会放开锁,给其他的线程使用。wait()有两种方式获得锁:1.wait(longtimeout),通过设定时间来获得锁,值得注意的是,timeout这个时间到了以后,它不会立即醒来,而是要看那个正在使用这把锁的线程是否结束。2.通过notify()的方法,通知需要这把锁的wait(),使之唤醒,还有wait 方法也要和sleep方法区别,上面说到sleep方法是不释放锁资源的。
相关文章推荐
- 使用Git上传本地项目代码到github
- 旋转90度也可以,Lumia的四大重置方式
- MVC5 Entity Framework学习之Entity Framework高级功能(转)
- kohana task 编写计划任务
- xcrun: error: active developer path
- [LeetCode] Maximal Square
- HTML5 web应用打包成android应用
- 第四章 fragment
- HTML/CSS学习笔记
- shell脚本中echo显示内容带颜色 【常用】
- 开通csdn博客。记录自己点滴成长
- 理解Golang包导入
- Android的HttpURLConnection
- SQL 最日期
- 鉴权加密
- SIM(USIM)卡中的数据和2G/3G网络的鉴权
- mfc static,checkbox,groupbox,redio 控件透明
- android preference 中entries和entryValues
- linux su和sudo命令的区别
- 移动端重构图片文字的水平垂直居中