005 线程的join方法

一 .概述

  join()方法可以让一个线程等待另外一个线程运行结束,同时join()方法具有可打断性,也就是说,在一定的时间点,线程可以不再等待继续执行.

  下面我们首先看一下这个例子.

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            IntStream.rangeClosed(1, 100).
                forEach((e)-> {
                    System.out.println(Thread.currentThread().getName() + "-- " + e);
                } );
        })  ;

        t.start();
        t.join();
        System.out.println("main thread is runnging...");

    }

我们发现,执行的结果表明,主线程是在子线程完全执行完毕才会执行的.

通过这个例子,我们可以知道,主线程是会等到子线程完全执行完毕才会执行的.



二 .使用join()完成任务分发和收集  

private static List<String> result =null;
    static {
        result = new ArrayList<>();
        Collections.synchronizedCollection(result);
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = getThread(1);
        Thread t2 = getThread(2);
        t1.start();
        t2.start();
        t1.join();
        t2.join();

        result.stream().forEach(System.out::println);
    }

    private static Thread getThread(long seconds) {
        return new Thread(()-> {
            try {
                TimeUnit.SECONDS.sleep(seconds);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String threadName = Thread.currentThread().getName();
            result.add(threadName);
            System.out.println(threadName + "已经完成任务了");
        });
    }

在上面的例子之中,我们首先常见了两个线程分别作子任务,将结果收集到一个容器之中.

当子线程完成任务的时候,我们的主线程继续执行,现在的结果容器之中就有了结果.

那么,主线程就可以通过子结果完成自己的任务收集工作了.

原文地址:https://www.cnblogs.com/trekxu/p/9513346.html

时间: 2024-10-10 23:40:58

005 线程的join方法的相关文章

多线程(守护线程、join方法、线程优先级、线程组)

setDaemon(boolean on): 守护线程(后台线程),若前台(显示)线程都结束了则后台线程自动结束. 使用setDaemon(boolean on)方法,必须在开启线程前将线程标记为守护线程. 示例: class setDaemon implements Runnable { public void run() { while (true) { System.out.println(Thread.currentThread().getName()+"...run"); }

多线程---其他方法 停止线程、守护线程、join方法

第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以让操作标记来结束线程. Thread类提供了interrupt()方法. 守护线程: 线程对象.setDaemon():该方法表示,前台线程(主线程) 一结束,后台线程(后台运行线程)立即结束. Join方法: 等待该线程终止.就是说在主线程运行时候,读到了该线程的开始阶段,

线程的join方法

线程的join方法 from threading import Thread import time def task(): print('子线程 start') time.sleep(2) print('子进程 end') t=Thread(target=task) t.start() t.join() print('主进程') from threading import Thread import time def task(name,n): print(f'{name} start') t

43. 守护线程 和 join方法

1.守护线程(后台线程):            我们在使用一款软件的时候,有的软件会让我们在不知道的情况下下载一些东西,那么这个就是后台线程.            一般用于提高软件的下载量(也就是赚取一些广告费)                        setDaemon(boolean b)    设置是否为守护线程            isDaemon()          返回是否为守护线程(是true否false)注意:当程序停止运行的时候,守护线程也必须停止 下面我们来模拟

线程的使用方法start run sleep join

今天回顾了Java的线程的一些知识 例1:下面代码存有详细的解释 主要是继承Thread类与实现Runnable接口 以及start()和run()方法 package com.date0607; /** * 在一个程序中同时运行的多个独立流程,每一个独立流程就是一个线程. * 线程开发两种方式:继承Thread类与实现Runnable接口. * start() 执行是无序的,不固定的.run() 执行有先后顺序. * 继承Thread是面向对象的编程方式. * 实现Runnable接口解决了单

转载,IBM一片文章,关于线程的start方法执行

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-processthread/#icomments Java 中的进程与线程 进程与线程在程序开发中无疑占有极其重要的地位,而 Java 语言为了能提供统一的.与平台无关的关于进程和线程的编程接口,必然要对操作系统提供的相关功能做进一步封装.本文主要介绍 Java 中关于进程与线程的相关封装类,揭示如何创建 Java 进程与线程,Java 封装类和实际的系统本地进程和线程是如何对应的,以及使用

C#中多线程Thread的Join方法

当我们的程序中使用多线程时,对资源的操作是需要特别留意的.如下面的例子:程序中有两个string对象(初始值为空),main函数中分别开启了两个线程去分别设置这两个string对象的值,然后在main函数中打印出这两个字符串的值.代码如下: static string str1 = string.Empty; static string str2 = string.Empty; static void Main(string[] args) { Thread worker1 = new Thre

多线程之join方法

join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法.如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完.而使用join方法后,直到这个线程退出,程序才会往下执行.下面的代码演示了join的用法. package mythread; public class JoinThread extends Thre

java的join方法

在某个线程中调用另一个线程的join方法,是将当前的cpu让给另一个线程,等到规定的时间到了或另一个线程执行结束后,自己再执行. package test; public class TestJoin1 { public static void main(String[] args) throws InterruptedException { TheOtherThread tot = new TheOtherThread(); Thread t = new Thread(tot); t.star