void join() Waits for this thread to die.
void join(long millis) Waits at most millis milliseconds for this thread to die.
void join(long millis, int nanos) Waits at most millis milliseconds plus nanos nanoseconds for this thread to die.
Thread.join()应该是让当前线程block住,等线程执行完之后,再继续执行,而且可以设置让当前线程等待的时间,如果超过时间,不用等当前线程执行完,就可以继续执行 。 比如有3个线程在执行计算任务,必须等三个线程都执行完才能汇总,那么这时候在主线程里面让三个线程join,最后计算结果既可。
package thread;
import java.util.Random;
public class TestThreadJoin {
public static void main(String[] args) {
CounterThread[] counter = new CounterThread[5];
Thread c;
long l = System.currentTimeMillis();
for (int i = 0; i < counter.length; i ++) {
counter[i] = new CounterThread();
c = new Thread(counter[i], "counter " + i);
c.start();
try {
c.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("all time = " + (System.currentTimeMillis() - l) + " ms");
int result = 0;
for (CounterThread re : counter) {
result += re.getResult();
}
System.out.println("result = " + result);
}
}
class CounterThread implements Runnable {
int result ;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
@Override
public void run() {
int time = (new Random().nextInt() >>> 1) % 5000;
try {
Thread.sleep(time);
System.out.println(Thread.currentThread().getName() + " sleep " + time + " ms");
} catch (InterruptedException e) {
e.printStackTrace();
}
result = 5;
}
}
执行结果:
counter 0 sleep 44 ms
counter 1 sleep 1161 ms
counter 2 sleep 4782 ms
counter 3 sleep 4264 ms
counter 4 sleep 3313 ms
all time = 13578 ms
result = 25
当设置
c.join(1000);
后,执行结果如下:
counter 0 sleep 93 ms
counter 2 sleep 864 ms
counter 1 sleep 3193 ms
all time = 3969 ms
result = 15
counter 3 sleep 3639 ms
counter 4 sleep 4806 ms
分享到:
相关推荐
在C#编程中,多线程是实现并发...然而,过度使用或者不当使用`Join()`可能导致阻塞和性能问题,因此在设计多线程程序时,应谨慎选择合适的同步机制,比如`Mutex`、`Semaphore`或`Monitor`等,以达到最佳的并发效果。
在计算机编程中,多线程是一种...这个“多线程例子.cpp”文件很可能是实现上述概念的一个具体实例,可能包括线程创建、同步、通信等操作。通过分析和学习这个例子,你可以更好地理解如何在实际项目中运用多线程技术。
在这个例子中,主线程首先启动线程1,然后调用`thread1.join()`等待线程1完成。同样地,主线程等待线程2执行完毕后再执行最后的打印语句。 总结: `join()`方法在Java多线程编程中扮演着重要角色,它可以确保线程的...
本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多线程 在 Java 中,可以通过继承 Thread 类或实现 Runnable 接口来创建多线程。在第一个例子中,我们将继承 Thread 类来创建...
下面将详细讲解三个C#线程的例子,以帮助理解如何在C#中管理和使用线程。 ### 例子1:后台线程(Background Thread) 在C#中,可以通过`System.Threading.Thread`类创建一个新的线程。以下是一个简单的后台线程...
本示例"商业编程-源码-Csharp实例81 Thread例子2"着重于如何理解和应用C#中的线程技术,这对于开发多任务并行运行的应用程序至关重要。线程允许程序在执行过程中同时进行多个不同的操作,极大地提高了效率,尤其是在...
C++是一种强大的、通用的...通过学习和实践这些例子,你可以深入理解C++的线程编程,并能够编写出更高效、更可靠的并发程序。记得在学习过程中,不仅要理解代码的运作机制,还要思考如何根据实际需求灵活运用这些知识。
这个例子展示了`Thread.join()`如何控制线程的执行顺序。在这个场景中,`A`线程先吃苹果,然后是`B`线程,最后是主线程。如果没有`A.join()`,`A`和`B`线程可能会交错执行,导致输出结果不确定。 在实际开发中,`...
以下是一个简单的互斥锁使用例子: ```cpp #include <windows.h> // 全局互斥锁 HANDLE g_hMutex = NULL; void ThreadFunction() { // 获取互斥锁,如果已被其他线程持有,则阻塞当前线程 if ...
`Thread`类代表程序中的一个执行线程,提供了创建、控制和管理线程的方法,如`start()`(启动线程)、`sleep()`(使线程暂停一段时间)和`join()`(等待当前线程结束)。 7. **Character类**:提供了一些处理单个...
下面是一个简单的`join()`使用示例: ```java public class JoinTest { public static void main(String[] args) { try { ThreadA t1 = new ThreadA("t1"); t1.start(); t1.join(); // 主线程等待t1执行完毕 ...
2. **面向对象方式**:使用`threading`模块中的`Thread`类来创建和管理线程。 #### 三、函数式方式示例 下面是一个使用`thread`模块创建多线程的简单示例: ```python # 导入必要的模块 import thread import ...
`Thread.py`文件可能包含自定义线程类的例子,你可以通过继承`threading.Thread`并重写`run()`方法来实现特定的线程行为: ```python class CustomThread(threading.Thread): def run(self): # 在这里执行自定义...
在这个例子中,两个线程(thread1和thread2)分别执行Worker方法。线程首先通过调用mutex.WaitOne()进入临界区,执行一些共享资源的操作,然后调用mutex.ReleaseMutex()释放锁,让其他线程有机会进入。...
这段代码创建了两个自定义线程`thread1`和`thread2`,它们都继承自`threading.Thread`类,并且重写了`__init__`和`run`方法。此外,还定义了一个`print_time`函数作为线程的主要执行体。 #### 四、线程同步 ##### ...
在这些代码中,可以找到如何创建、启动、同步和结束线程的例子。 线程的创建通常通过`boost::thread`类完成,如以下代码所示: ```cpp #include <boost/thread/thread.hpp> void workerFunction() { // 线程执行...
在Java多线程编程中,理解并正确使用`yield`和`join`方法是至关重要的。这两个方法都属于线程控制策略的一部分,但它们的作用和使用场景有所不同。 首先,我们来详细探讨`Thread.yield()`方法。这个方法的目的是让...
在C#中,我们可以使用`System.Threading`命名空间下的类来创建和控制线程。`Thread`类是最基础的线程操作类,我们可以通过实例化它并调用`Start()`方法来启动一个新的线程。 下面是一段创建和启动三个线程的示例...
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
通过`Thread.CurrentThread`获取当前线程,`Thread.Sleep`使线程暂停,`Thread.Abort`强制终止线程(不推荐,可能导致资源泄露),`Thread.Join`等待线程结束。 在C#中,`async/await`关键字用于实现异步编程,这与...