API:
join
public final void join() throws InterruptedException
InterruptedException
- 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
join
public final void join(long millis) throws InterruptedException
millis
毫秒。超时为 0
意味着要一直等下去。
millis
- 以毫秒为单位的等待时间。InterruptedException
- 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
join
public final void join(long millis, int nanos) throws InterruptedException
millis
毫秒 + nanos
纳秒。
millis
- 以毫秒为单位的等待时间。nanos
- 要等待的 0-999999 附加纳秒。IllegalArgumentException
- 如果 millis 值为负,则 nanos 的值不在 0-999999 范围内。InterruptedException
- 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。解析:
Thread.join(),是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。
Thread.join(1000s),这句话的意思是,只要满足下面2个条件中的一个时,主线程就会继续执行thread.join(1000s)后面的代码:
条件1:thread 执行完毕;
条件2:已经等待 thread 执行了1000ms.
Demo:
package cn.com.common.thread; import java.util.Date; import java.util.concurrent.TimeUnit; /** * * @ClassName: ThreadJoinTest * @Description:Thread.join()方法解析 * @author linsky328 * @date 2017年7月4日 上午10:22:36 * */ public class ThreadJoinTest { public static void main(String[] args){ DataSourcesLoader dsLoader = new DataSourcesLoader(); Thread thread1 = new Thread(dsLoader,"DataSourceThread"); NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader(); Thread thread2 = new Thread(ncLoader,"NetworkConnectionLoader"); thread1.start(); thread2.start(); try { /** * Thread.join(),是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。 */ thread1.join(); /** * Thread.join(1900),是用来指定当前主线程等待其他线程执行1.9秒后,再来继续执行Thread.join(1900)后面的代码。 */ thread2.join(1900); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Main: Configuration has been loaded: %s\n",new Date()); } } class DataSourcesLoader implements Runnable{ @Override public void run() { System.out.printf("Beginning data sources loading: %s\n",new Date()); try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Data sources loading has finished: %s\n",new Date()); } } class NetworkConnectionsLoader implements Runnable{ @Override public void run() { System.out.printf("Beginning network connect loading: %s\n",new Date()); try { TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Network connect loading has finished: %s\n",new Date()); } }
运行结果:
Beginning data sources loading: Tue Jul 04 11:19:18 CST 2017
Beginning network connect loading: Tue Jul 04 11:19:18 CST 2017
Data sources loading has finished: Tue Jul 04 11:19:23 CST 2017
Main: Configuration has been loaded: Tue Jul 04 11:19:24 CST 2017
Network connect loading has finished: Tue Jul 04 11:19:25 CST 2017
相关推荐
是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。 Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates 有两个主要问题: ...
在Java编程语言中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程(调用者)等待另一个线程(被调用者)执行完成。`Thread.join()`的使用能够有效地解决多线程环境中的顺序执行问题,确保线程间的...
C++11中关于std::thread的join详解 C++11引入了std::thread库,提供了对多线程编程的支持。std::thread库提供了两个基本操作:join和detach。join操作用于回收线程资源,避免资源泄露;detach操作用于将线程与创建...
`join()`方法定义在`java.lang.Thread`类中,其主要功能是使调用该方法的线程(这里称为调用线程)暂停执行,直到目标线程(即`join()`方法所在的线程)执行完毕。这样,可以确保调用线程在目标线程执行完成后才...
### C# 线程(Thread)同步处理详解 在.NET平台上进行多线程编程时,线程同步是一项至关重要的技术。线程同步的主要目的是确保多个线程在访问共享资源时不会产生数据竞争和不一致的情况。本文将详细介绍C#中的几种...
### 详解 Python 中的线程与线程池 在探讨 Python 中线程与线程池的概念之前,我们先了解一些基本概念。 #### 进程与线程的基本概念 **进程**(Process):进程是操作系统资源分配的基本单位,也是用户程序的一次...
Java中的`join()`方法是多线程编程中的一个重要特性,用于控制线程间的协作和同步。在Java中,多线程允许程序同时执行多个任务,但有时我们需要确保某些线程按照特定顺序完成,或者主线程需要等待其他线程执行完毕后...
C++11的标准类std::thread对线程进行了封装,定义了C++11标准中的一些表示线程的类、用于互斥访问的类与方法等。应用C++11中的std::thread便于多线程程序的移值。 std::thread类成员函数: (1)、get_id:获取线程ID...
在"JAVA多线程编程详解-详细操作例子.doc"和"Java多线程编程详解.doc"文档中,你应该能找到关于以上知识点的具体示例和深入解释,包括如何创建线程、线程间的通信(如wait/notify机制、Semaphore、CountDownLatch)...
最后,Thread.Join方法是另一种简单的同步手段,它使得一个线程等待另一个线程完成后再继续执行。这在需要按特定顺序执行线程或者依赖其他线程的结果时非常有用。 综上所述,.NET框架提供了丰富的多线程同步机制,...
`Thread.Join`方法支持设置超时参数,超时后返回false。在这种情况下,可以考虑使用`Interrupt`或`CancellationToken`的方式终止线程。 #### 五、线程安全的工具类 为了保证线程安全,.NET还提供了许多现成的工具...
在`ThreadTest.cs`中,可能会看到如何使用`Join`方法来确保主线程等待工作线程完成。 ```csharp workerThread.Start(); workerThread.Join(); ``` 2. `Thread.Suspend()`和`Resume()`: 这两个方法已过时,因为它们...
**TIMED_WAITING(超时等待)**:线程处于有限期等待状态,等待另一个线程执行依赖于指定等待时间的操作,例如调用`Object.wait(long timeout)`、`Thread.join(long timeout)`或`Thread.sleep(long millis)`等方法。...
下面将详细介绍`Thread`类的使用方法和相关函数。 1. **创建线程** 创建线程有两种方式: - **通过回调对象**:你可以通过给`Thread`构造函数传递一个可调用对象(如函数)和其参数来创建线程,如`mthread = ...
Java多线程join方法实例代码 ...* Java多线程join方法详解:https://www.cnblogs.com/itech/archive/2012/07/20/2598162.html * Java多线程编程基础:https://www.runoob.com/java/java-multithreading.html
MySQL 配置文件 my.cnf 详解 MySQL 的配置文件 my.cnf 是 MySQL 服务器的核心配置文件,其中包含了 MySQL 服务器的大部分配置参数。通过对 my.cnf 文件的配置,可以对 MySQL 服务器的性能和安全性产生重要的影响。...
C++ Thread_Local 详解 C++ 中的 Thread_Local 关键字是 C++11 引入的新特性,该关键字主要用于解决多线程环境下的资源竞争问题。在多线程环境下,如果多个线程访问同一个全局变量,可能会出现资源竞争的问题,导致...
thread.join():在子线程完成运行之前,该子线程的父线程(一般就是主线程)将一直存在,也就是被阻塞 实例: #!/usr/bin/python # encoding: utf-8 import threading from time import ctime,sleep def func1(): ...