thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
t.join(); //当前线程中加入线程t,当t执行完成后,当前线程才继续进行。
t.join(1000); //等待 t 线程,等待时间是1000毫秒,无论t是否执行完,主线程1000s后都将会执行。
应用一 : 实现多个线程的串行化调度。代码如下:
package com.xx.concurrent.commonUse; public class SerialThread { public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[100]; for(int i=0; i< 100; ++i){ if (i == 0 ){ threads[i] = new Thread(new MyThread(i,null)); }else{ threads[i] = new Thread(new MyThread(i,threads[i-1])); } threads[i].start(); } } } class MyThread implements Runnable { private int id ; private Thread priorThread ; public MyThread(int id,Thread priorThread ){ this.id = id ; this.priorThread = priorThread; } @Override public void run() { if (priorThread != null){ try { priorThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread-" + this.id + " is running over ....."); } }
输出结果:
Thread-0 is running over ..... Thread-1 is running over ..... Thread-2 is running over ..... Thread-3 is running over ..... Thread-4 is running over ..... Thread-5 is running over ..... Thread-6 is running over ..... Thread-7 is running over ..... Thread-8 is running over ..... Thread-9 is running over ..... Thread-10 is running over ..... Thread-11 is running over ..... Thread-12 is running over ..... Thread-13 is running over ..... Thread-14 is running over ..... Thread-15 is running over ..... Thread-16 is running over ..... Thread-17 is running over ..... Thread-18 is running over ..... Thread-19 is running over ..... Thread-20 is running over ..... Thread-21 is running over ..... Thread-22 is running over ..... Thread-23 is running over ..... Thread-24 is running over ..... Thread-25 is running over ..... Thread-26 is running over ..... Thread-27 is running over ..... Thread-28 is running over ..... Thread-29 is running over ..... Thread-30 is running over ..... Thread-31 is running over ..... Thread-32 is running over ..... Thread-33 is running over ..... Thread-34 is running over ..... Thread-35 is running over ..... Thread-36 is running over ..... Thread-37 is running over ..... Thread-38 is running over ..... Thread-39 is running over ..... Thread-40 is running over ..... Thread-41 is running over ..... Thread-42 is running over ..... Thread-43 is running over ..... Thread-44 is running over ..... Thread-45 is running over ..... Thread-46 is running over ..... Thread-47 is running over ..... Thread-48 is running over ..... Thread-49 is running over ..... Thread-50 is running over ..... Thread-51 is running over ..... Thread-52 is running over ..... Thread-53 is running over ..... Thread-54 is running over ..... Thread-55 is running over ..... Thread-56 is running over ..... Thread-57 is running over ..... Thread-58 is running over ..... Thread-59 is running over ..... Thread-60 is running over ..... Thread-61 is running over ..... Thread-62 is running over ..... Thread-63 is running over ..... Thread-64 is running over ..... Thread-65 is running over ..... Thread-66 is running over ..... Thread-67 is running over ..... Thread-68 is running over ..... Thread-69 is running over ..... Thread-70 is running over ..... Thread-71 is running over ..... Thread-72 is running over ..... Thread-73 is running over ..... Thread-74 is running over ..... Thread-75 is running over ..... Thread-76 is running over ..... Thread-77 is running over ..... Thread-78 is running over ..... Thread-79 is running over ..... Thread-80 is running over ..... Thread-81 is running over ..... Thread-82 is running over ..... Thread-83 is running over ..... Thread-84 is running over ..... Thread-85 is running over ..... Thread-86 is running over ..... Thread-87 is running over ..... Thread-88 is running over ..... Thread-89 is running over ..... Thread-90 is running over ..... Thread-91 is running over ..... Thread-92 is running over ..... Thread-93 is running over ..... Thread-94 is running over ..... Thread-95 is running over ..... Thread-96 is running over ..... Thread-97 is running over ..... Thread-98 is running over ..... Thread-99 is running over .....
Thread中的join源码如下:
/** * Waits at most <code>millis</code> milliseconds for this thread to * die. A timeout of <code>0</code> means to wait forever. * * @param millis the time to wait in milliseconds. * @exception InterruptedException if any thread has interrupted * the current thread. The <i>interrupted status</i> of the * current thread is cleared when this exception is thrown. */ public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
join方法首先判断线程t的状态,线程状态为已启动状态下,才有效,因此t.join()一般在t.start()之后。主线程t.join时候,会获得线程对象t的锁(wait 意味着拿到该对象的锁),或者调用该对象的wait(等待时间),直到该对象唤醒主线程。可以看出t线程的运行结束即可唤醒主线程。
相关推荐
第一章 Java 并发编程实践基础..............................................................1 1.1 进程与线程.................................................................................................
线程:Java多线程的实现方式,包括继承Thread类和实现Runnable接口。 锁:Java中的锁机制,包括synchronized关键字和ReentrantLock类。 线程池:Java中的线程池机制,包括线程池的创建、执行任务、关闭等操作。 并发...
目录 .........................................................................................................................................................1 JVM ......................................
Get to grips with thread management, the Fork/Join framework, concurrency classes and much more in this book and e-book A practical Cookbook packed with recipes for achieving the most important Java ...
java7在并发编程方面,带来了很多令人激动的新功能,这将使你的应用程序具备更好的并行任务性能。 《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API中大部分重要而有用的机制。全书分为9...
目录 .........................................................................................................................................................1 JVM .......................................
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
第一章 Java 并发编程实践基础..............................................................1 1.1 进程与线程.................................................................................................
Java并发编程的4种风格:Threads,Executors,ForkJoin和Actors 我们生活在一个事情并行发生的世界。自然地,我们编写的程序也反映了这个特点,它们可以并发的执行。当然除了Python代码(译者注:链接里面讲述...
java并发编程总结,包括多线程安全机制分析总结,Unsafe源码分析总结,并发工具类总结,ThreadLocal原理和使用,Fork/Join框架使用总结,同步容器和并发容器源码分析
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
Chapter 1, Thread Management will teach the readers how to make basic operations with threads. Creation, execution, and status management of the threads are explained through basic examples. Chapter 2...
java并发,主要用于初学者学习,主要案列,Thread.join,ThreadLocal,Lock接口,LockSupport,Condition接口,ConcurrentHashMap的实现原理与使用 Fork/Join 框架,CountDownLatch,CyclicBarrier,Semaphore,...
通过将 MyRunnable 对象传递给 Thread 类的构造方法,我们创建了一个新的线程,并将 run 方法作为线程的执行逻辑。 除了基本的线程创建和启动,Java还提供了一些管理线程的方法和工具,例如: sleep 方法:使当前...
第3章 多线程(二) Java 高级程序设计 Java高级程序设计-多线程(二)全文共34页,当前为第1页。 回顾 进程一般代表一个应用程序,一个进程中可以包含多个线程。 合理使用多线程能够提高程序的执行效率,处理高并发...
join方法的原理; join什么时候被唤醒 thread.cpp; 内存屏障 硬件: Load Barrier Store Barrier volatile ;指令重排序 CPU 不断提高利用率 ; 从进程 - > 线程 ->指令
java二叉树算法源码 Java核心知识库:backpack::包含集合框架、JVM机制、多线程、SSM框架、MySQL、分布式、微服务、高并发与高可用等。:bookmark: :lollipop::lollipop::lollipop:全文持续更新中 ...深入理解:Thread
为单线程JavaScript实现多线程并发的功能,语意上参考Java实现,提供getState / sleep / join等API,并提供线程间通信的功能,依赖ES6语法,基于Promise和Async函数实现,故需要Babel编译才能运行。JavaScrpt本来...
趣解Thread和Object类中线程相关方法:wait、notify、join、yield… 线程属性 线程异常处理 线程安全与程序性能的取舍之道 ... 3 环境参数 Maven 3.6+ JDK 8+ Tomcat 8.5+ MySQL 8.0.16+ Redis 6.0+ Intellij IDEA ...
第4章 学生并发接水(线程Thread) 4.1 学生并发接水原理 4.1.1 项目结构框架分析 4.1.2 项目功能业务分析 4.2 不排队形式学生并发接水 4.2.1 水龙头类 4.2.2 学生类 4.2.3 测试类 4.3 学生并发接水的其他形式 4.3.1...