Java多线程:线程调度Join
来源:互联网 发布:免费提词器软件 编辑:程序博客网 时间:2024/05/19 21:15
public final void join() throws InterruptedException
等待该线程终止。
public final void join(long millis) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
public final void join(long millis, int nanos) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
这就意味着main 线程调用t.join 时,必须能够拿到线程t 对象的锁 ,如果拿不到它是无法wait 的,刚开的例子t.join(1000) 不是说明了main 线程等待1 秒,如果在它等待之前,其他线程获取了t 对象的锁,它等待时间可不就是1 毫秒了。
等待该线程终止。
public final void join(long millis) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。
public final void join(long millis, int nanos) throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
package basic.c_join;public class TestJoinA {public static void main(String[] args) {Thread t = new Thread(new TestRunnableImpl());t.start();try {t.join(1000); // 主线程只等1秒,不管子线程什么时候结束System.out.println("joinFinish");} catch (InterruptedException e) {e.printStackTrace();}}}class TestRunnableImpl implements Runnable {public void run() {try {System.out.println("Begin sleep");// 如果改成sleep(2000), 那么主线程就会先结束Thread.sleep(1000);System.out.println("End sleep");} catch (InterruptedException e) {e.printStackTrace();}}}其实Join 方法实现是通过wait (小提示:Object 提供的方法)。 当main 线程调用t.join 时候,main 线程会获得线程对象t 的锁 (wait 意味着拿到该对象的锁), 调用该对象的wait( 等待时间) ,直到该对象唤醒main 线程,比如退出后。
这就意味着main 线程调用t.join 时,必须能够拿到线程t 对象的锁 ,如果拿不到它是无法wait 的,刚开的例子t.join(1000) 不是说明了main 线程等待1 秒,如果在它等待之前,其他线程获取了t 对象的锁,它等待时间可不就是1 毫秒了。
package basic.c_join;import org.apache.log4j.Logger;public class TestJoinB {private static Logger logger = Logger.getLogger(TestJoinB.class);public static void main(String[] args) {Thread t = new Thread(new RunnableImpl());new ThreadTest(t).start();// 这个线程会持有锁t.start();try {// 因为线程对象t的锁已经被其他线程获得, 要logger.debug("beforejoin");t.join();logger.debug("joinFinish");} catch (InterruptedException e) {e.printStackTrace();}}}class ThreadTest extends Thread {private static Logger logger = Logger.getLogger(ThreadTest.class);Thread thread;public ThreadTest(Thread thread) {this.thread = thread;}@Overridepublic void run() {logger.debug("run1 before");holdThreadLock();logger.debug("run1 end");}public void holdThreadLock() {synchronized (thread) {logger.debug("getObjectLock");try {Thread.sleep(9000);} catch (InterruptedException ex) {ex.printStackTrace();}logger.debug("ReleaseObjectLock");}}}class RunnableImpl implements Runnable {private static Logger logger = Logger.getLogger(RunnableImpl.class);public void run() {logger.debug("run2 before");try {logger.debug("Begin sleep");Thread.sleep(2000);logger.debug("End sleep");} catch (InterruptedException e) {e.printStackTrace();}logger.debug("run2 end");}}
- Java多线程:线程调度Join
- java多线程基础(5)-调度方式之暂停当前线程方式4-连接线程(join)
- java 多线程join,合并线程
- java 多线程(2) 线程的调度和优先级 / sleep() / interrupt() 打断join() / yield() / setPriority()
- Java多线程-线程的调度
- Java多线程-线程的调度(守护线程)
- java多线程:线程的调度-守护线程
- Java多线程 -- 线程的调度-守护线程
- Java多线程-线程的调度(守护线程)
- Java多线程-线程状态、sleep()、yield()、join()
- Java多线程____线程状态Join()方法
- Java多线程 线程的调度(休眠)
- Java多线程-线程的调度(合并)
- Java多线程-线程的调度(让步)
- Java多线程-线程的调度(优先级)
- java多线程: 线程的调度-休眠
- Java多线程:线程的调度-优先级
- java多线程:线程的调度-让步
- HTML5 Canvas编写五彩连珠(2):画图
- Struts2类型转换的说明及案例分析
- 操作Excel出现“外部表不是预期的格式”错误
- java中的反射机制在android中的应用
- Java中利用simpleFramework解析xml
- Java多线程:线程调度Join
- php中如何使用KindEditor编辑器
- lua作为配置文件的读取方法
- 矩阵乘法的并行化改造
- 吃鸡蛋也有大讲究
- HDUOJ 2050
- POJ-1465(同余+高精度)
- Android学习不错的资源
- 虚拟机安装Oracle + 本机安装Oracle客户端进行访问