转自http://blog.csdn.net/anhuixiaozi/article/details/4548679
join的用法,先看几个例子在说。
程序1:
public class ThreadTest implements Runnable {
public static int a = 0;
public synchronized void inc() {
a++;
}
public void run() {
for (int i = 0; i < 5; i++) {
inc();
}
}
public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
t1.start();
System.out.println(a);
}
}
咋一看以为结果是:5 ,其实不然
程序2:在一基础上添加点东西 System.out.println(a+",");
public class ThreadTest implements Runnable {
public static int a = 0;
public synchronized void inc() {
a++;
System.out.println(a+",");
}
public void run() {
for (int i = 0; i < 5; i++) {
inc();
}
}
public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
t1.start();
System.out.println(a);
}
}
结果:
0
1,2,3,4,5,
说明a已经被加了5次。但有两个问题
1)为什么main方法中的打印语句还是0呢?
2)为什么main方法中的打印语句先执行了呢?
程序3
public class ThreadTest implements Runnable {
public static int a = 0;
public synchronized void inc() {
a++;
}
public void run() {
for (int i = 0; i < 5; i++) {
inc();
}
}
public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
t1.start();
for (int i=0; i<300; i++) {
System.out.print(i);
}
System.out.println();
System.out.println(a);
}
}
结果:
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
5
此时的结果5正确了。说明线程在i循环100次后,全部都结束了。
之所以会产生1)和2)原因是:由于有两个线程,我们不知道主线程执行到什 么时候开始执行子线程,这是由于虽然你调用start方法但是调用该方法只是准备线程并不是马上启动.所以,当程序执行的时候,很随机地执行这两个线程中 的一个,也就很随机地执行System.out.println(a); 这个语句了.于是,有可能子线程只执行了1次a=+1这个语句,也可能是2次或者其它多少次,还可能是0次,所以打印的结果是个随机数
程序4:在程序1的基础上添加 t1.join(); 达到与程序3同样的效果
public class ThreadTest implements Runnable {
public static int a = 0;
public synchronized void inc() {
a++;
}
public void run() {
for (int i = 0; i < 5; i++) {
inc();
}
}
public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
t1.start();
t1.join();
System.out.println(a);
}
}
结果:5
总结:join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。
相关推荐
以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...
1. 除了fork()和join()方法外,不得使用其他的同步工具。线程最好不要调用sleep()方法。 2. 线程不得进行I/O操作,因为I/O操作会导致线程阻塞,这会降低任务的并行度。 3. 线程不得抛出checked exception,如果需要...
4. **Join(合)**:当子任务完成后,原始任务会使用`join()`方法等待所有子任务的结果,然后合并结果或继续执行后续逻辑。 5. **工作窃取**:每个工作线程除了处理自己的任务队列外,还会尝试“窃取”其他线程的...
在Java编程语言中,"左关联"和"右关联"是数据库查询操作中的概念,通常在SQL中使用JOIN语句实现。在这个场景下,我们讨论的是如何使用Java代码来模拟这些数据库操作,以达到高效、便捷地处理数据关联的目的。 首先...
Oracle Join是数据库操作中一种非常重要的技术,用于合并多个表的数据。在Oracle SQL中,Join主要分为几个类型,包括INNER JOIN、LEFT ...在Java开发中,正确地使用JOIN可以使代码更简洁,更高效地处理跨表的数据操作。
浅谈Java线程join方法使用方法 Java中的线程join方法是一种实现线程同步的方式,可以将原本并行执行的多线程方法变成串行执行的。在Java中,线程join方法的作用是使当前线程等待另一个线程的结束,然后再继续执行...
例如,在处理数据的线程A完成后,我们可能希望清理资源的线程B再开始,这时就可以使用`join()`。 接着是`daemon`线程。在Java中,主线程(用户线程)是程序执行的入口,而`daemon`线程则是一种后台服务线程,它不...
主要介绍了java 线程方法join简单用法,结合实例形式总结分析了Java线程join方法的功能、原理及使用技巧,需要的朋友可以参考下
Java线程中的`join()`方法是一个非常重要的同步工具,它允许一个线程(通常为主线程)等待另一个线程(子线程)执行完成后再继续执行。`join()`方法定义在`java.lang.Thread`类中,它使得多线程间的协作更加有序。 ...
Fork/Join框架是Java并发库中的一部分,自Java 7开始引入,它为开发者提供了一种高效的处理大规模计算任务的方法。这个框架基于分治策略,将大任务分解成若干小任务,然后并行执行这些小任务,最后再将结果合并。...
总结来说,Fork/Join框架是Java并发编程的重要进步,它通过提供一种易于理解和使用的并行编程模型,降低了编写高效并发程序的难度。结合java.util.concurrent包中的其他工具,开发者可以构建出既安全又高效的并发...
在上述代码中,`Partner.java`可能包含了一个示例,演示了如何使用join()方法来协调两个或多个线程的执行。而`Java.jpg`可能是用来辅助理解多线程概念的图片,例如展示线程的生命周期或join()方法在程序流程中的位置...
在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...
在Java多线程编程中,理解并正确使用`yield`和`join`方法是至关重要的。这两个方法都属于线程控制策略的一部分,但它们的作用和使用场景有所不同。 首先,我们来详细探讨`Thread.yield()`方法。这个方法的目的是让...
例如,在Java8中,使用LongStream.rangeClosed方法可以生成一个顺序流,而使用parallel方法可以将其转换为并行流。 LongStream.rangeClosed(0, 10000000000L).sequential(); LongStream.rangeClosed(0, ...
在Java编程语言中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程(调用者)等待另一个线程(被调用者)执行完成。`Thread.join()`的使用能够有效地解决多线程环境中的顺序执行问题,确保线程间的...
Java中的`join()`方法是多线程编程中的一个重要特性,用于控制线程间的协作和同步。在Java中,多线程允许程序同时执行多个任务,但有时我们需要确保某些线程按照特定顺序完成,或者主线程需要等待其他线程执行完毕后...
Java中的`join()`方法是线程控制的一种重要手段,它允许一个线程等待另一个线程完成其执行。在多线程编程中,我们经常需要确保某些线程按特定顺序执行,或者在一个线程运行完毕后再启动另一个线程,`join()`方法就是...
Java ForkJoin框架的原理及用法 Java ForkJoin框架是Java 1.7后提供的一种多线并发处理框架,主要思想是分而治之,将复杂的计算按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。ForkJoin框架的使用...