admin管理员组文章数量:1122850
【多线程
Join 方法
Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并发执行变为串行执行
样例:
public class JoinTest {public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");t1.start();/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会*/t1.join();//注意:是放弃当前线程,当前线程为主线程,所以,t2.start()如果放在前面,t1和t2线程还会竞争资源t2.start();}
}
class ThreadJoinTest extends Thread{public ThreadJoinTest(String name){super(name);}@Overridepublic void run(){for(int i=0;i<1000;i++){System.out.println(this.getName() + ":" + i);}}
}
join方法的作用
在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。
传参
join方法其实也可以接收参数的,join方法中如果传入参数,则表示这样的意思:如果A线程中调用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并发执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。
join与start调用顺序问题
join方法必须在线程start方法调用之后调用才有意义。
很容易理解:如果一个线程都没有start,那它也就无法同步了。
sleep 方法
方法介绍
- sleep(long millis) 线程睡眠 millis 毫秒
- sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒
调用sleep
因为sleep()是静态方法,所以最好的调用方法就是 Thread.sleep()。
sleep方法是让哪个线程睡眠
结论:sleep方法只能让当前线程睡眠。调用某一个线程类的对象t.sleep(),睡眠的不是t,而是当前线程。线程的sleep方法应该写在线程的run()方法里,就能让对应的线程睡眠。
控制线程睡眠的其他方法
- TimeUnit.SECONDS.sleep(1);
- TimeUnit.MINUTES.sleep(1);
- TimeUnit.HOURS.sleep(1);
- TimeUnit.DAYS.sleep(1);
作用和sleep一样,但是程序可读行更高,在项目中,推荐这种写法。
本文标签: 多线程
版权声明:本文标题:【多线程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1700215481a288925.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论