JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
thread1.join(10000)表示主线程将等待thread1运行10000后,才开始继续运行该语句后面的语句。
public static void main(String args[]){
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
int i=10000000;
while(i>0){
System.out.println("run():"+i);
i--;
}
}
});
t1.setDaemon(true);
t1.start();
try {
t1.join(10000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
while(true){
System.out.println("main():"+Thread.currentThread().getName());
}
}
可以看出主线程一直在等待t1线程的运行,等了10000后,主线程的while语句开始执行,由于此时t1线程也未结束,故main线程与t1线程交替执行。故join的意思就是,主线程等待子线程若干秒后一起参与进来。
当join(0)时表示主线程将一直等待t1线程执行结束后才开始执行。
public static void main(String args[]){
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
int i=1000000;
while(i>0){
System.out.println("run():"+i);
i--;
}
}
});
t1.setDaemon(true);
t1.start();
try {
t1.join(0);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
while(true){
System.out.println("main():"+Thread.currentThread().getName());
}
}
可以看到t1完成以后,main线程开始执行。
源码:
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;
}
}
}
首先, 当main 线程调用t.join 时候,main 线程会获得线程对象t1 的锁 , 判断t1对象所对应的线程是否活动状态,若为活动状态,那么就调用该对象的wait( 等待时间) ,也就是说main线程进入了t1对象的等待池。
now变量是一个记录从触发该方法到当前时间的累积。delay表示还需等待多久,如果t1线程一直存活着,那么delay将被不断的计算,并且将不断地设置main线程等待的时间,假设某时循环到delay=1,此时设置main等待1,在下一次计算时delay可能等于-2,那么此时程序将跳出join方法,而main线程等待1之后将执行后面的语句。
相关推荐
【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip
目录 3.1 3.2 3.3 认识线程 创建线程 join 3.4 线程同步 《Python基础实训教程》第3章-多线程全文共23页,当前为第2页。 认识线程 3.1 《Python基础实训教程》第3章-多线程全文共23页,当前为第3页。 3.1 认识线程 ...
Java实验指导书_多线程 《Java语言程序设计基础教程》 上机实验指导手册 异常处理 【目的】 ①线程的创建和运行 ②Thread类的sleep、join等方法的使用 ③线程同步
某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明 简单的多线程 import threading, time def test1(x): time.sleep(5) print(x**x) #下面定义两个线程调用...
分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...
start() 和 run() 区别sleep() 和wait() 的区别blocked 状态和waiting 状态的区别线程的常用方法join() 和 yeild()创建线程有哪些方式?你平时是怎么写的?线程池的三个方法,七大参数,四种策略?如何配置线程池...
本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...
多线程操作时可能会遇到线程抢占的情况。 具体实现: import threading import time def thread_job(): print("T1 start\n") time.sleep(0.1) # 延时0.1s print("T1 finish\n") added_thread=threading.Thread...
01-并发简史.avi 02-线程和进程.avi 03-创建线程的方式(1).avi ...08-多线程的风险.avi 09-CAS.avi 10-线程的状态.avi 11-面试题.avi 12-java.util.concurrent包下的类.avi 13-ReadWriteLock.avi 14-countDownLatch.avi
9_多线程-yield-join-daemon-synchronized; o, E; \* I: E2 W 10_多线程-同步代码块-同步方法 11_多线程-生产消费问题 12_多线程-死锁问题 13_字符集问题' X4 e; v9 q' U2 W% f" l7 f$ F 14_String-StringBuffer-...
为单线程JavaScript实现多线程并发的功能,语意上参考Java实现,提供getState / sleep / join等API,并提供线程间通信的功能,依赖ES6语法,基于Promise和Async函数实现,故需要Babel编译才能运行。JavaScrpt本来...
多线程并发访问,同步控制 线程间通信,等待/通知机制 锁锁机制,API详解 Fork/Join 框架机制详解 Executor线程池框架简介 面向对象 泛型机制与反射原理 Proxy动态代理机制详解 从整体上观察对象 网络开发 Servlet...
【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口与继承Thread类比较 73 【多线程】线程状态转换 74 【多线程】线程的调度 75 线程优先级 75 sleep 76 wait 76 yield 77 join ...
目录1、Python GIL(Global Interpreter Lock)2、进程(process)多进程multiprocessing进程间通讯-Queues/Pipes/Managers进程锁进程池3、线程(thread)语法join函数daemon(守护线程)线程锁之Lock(互斥锁mutex)/RLock...
多线程中使用lambda 在本篇文章中,主要介绍lambda函数在多线程中的使用。 先从下面的例子开始吧: #include #include int main() { std::thread t([]() { std::cout << thread function\n; }); ...
多线程是有劣势的,“GIL”(全局解释器锁)让它没能更有效率的处理一些分摊的任务,而现在的电脑大部分配备了多核处理器,多进程可以让电脑更有效率的分配任务给每一个处理器, 这种做法有效解决多线程的弊端。...
第一章 线程基础、线程之间的共享和协作 3 一、基础概念 3 1. 什么是进程和线程 3 2. CPU核心数和线程数的关系 3 3. 澄清并行和并发 5 4. 多线程程序需要注意事项 6 二、认识Java里的线程 7 1. Java程序天生就是多...
一个java的多线程juc总结,其中包含基础知识,现成的状态图,关于synchronized,线程优先级和线程分类,interrupt、interupted、isInterrupted的使用,sleep、yield、join的详细使用,锁和等待池介绍。