Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行。

public static void main(String[] args) throws InterruptedException
{
System.out.println("main start"); Thread t1 = new Thread(new Worker("thread-1"));
t1.start();
t1.join();
System.out.println("main end");
}

在上面的例子中,main线程要等到t1线程运行结束后,才会输出“main end”。如果不加t1.join(),main线程和t1线程是并行的。而加上t1.join(),程序就变成是顺序执行了。

我们在用到join()的时候,通常都是main线程等到其他多个线程执行完毕后再继续执行。其他多个线程之间并不需要互相等待。

下面这段代码并没有实现让其他线程并发执行,线程是顺序执行的。

public static void main(String[] args) throws InterruptedException
{
System.out.println("main start"); Thread t1 = new Thread(new Worker("thread-1"));
Thread t2 = new Thread(new Worker("thread-2"));
t1.start();
//等待t1结束,这时候t2线程并未启动
t1.join(); //t1结束后,启动t2线程
t2.start();
//等待t2结束
t2.join(); System.out.println("main end");
}

为了让t1、t2线程并行,我们可以稍微改一下代码,下面给出完整的代码:

public class JoinTest
{ public static void main(String[] args) throws InterruptedException
{
System.out.println("main start"); Thread t1 = new Thread(new Worker("thread-1"));
Thread t2 = new Thread(new Worker("thread-2")); t1.start();
t2.start(); t1.join();
t2.join(); System.out.println("main end");
}
} class Worker implements Runnable
{ private String name; public Worker(String name)
{
this.name = name;
} @Override
public void run()
{
for (int i = 0; i < 10; i++)
{
try
{
Thread.sleep(1l);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(name);
}
} } thread的六种状态
线程共有6种状态;在某一时刻只能是这6种状态之一。这些状态由Thread.State这个枚举类型表示,并且可以通过getState()方法获得当前具体的状态类型。

  NEW

  至今尚未启动的线程的状态。

  当使用new一个新线程时,如new
Thread(r),但还没有执行start(),线程还没有开始运行,这时线程的状态就是NEW。

  RUNNABLE

  可运行线程的线程状态。

  当start()方法被调用时,线程就进入RUNNABLE状态。此时的线程可能正在运行,也可能没有运行

  BLOCKED

  受阻塞并且正在等待监视器锁的某一线程的线程状态。

  下列情况会进入阻塞状态:

  1.等待某个操作的返回,例如IO操作,该操作返回之前,线程不会继续下面的代码。

  2.等待某个“锁”,在其他线程或程序释放这个“锁”之前,线程不会继续执行。

  3.等待一定的触发条件。

  4.线程执行了sleep方法。

  5.线程被suspend()方法挂起。

  一个被阻塞的线程在下列情况下会被重新激活:

  1.执行了sleep()方法,睡眠时间已到。

  2.等待的其他线程或程序持有的“锁”已被释放。

  3.正在等待触发条件的线程,条件得到满足。

  4.执行了suspend()方法,被调用了resume()方法。

  5.等待的操作返回的线程,操作正确返回。

  WAITING

  某一等待线程的线程状态。

  线程因为调用了Object.wait()或Thread.join()而未运行,就会进入WAITING状态。

  TIMED_WAITING

  具有指定等待时间的某一等待线程的线程状态。

  线程因为调用了Thread.sleep(),或者加上超时值来调用Object.wait()或Thread.join()而未运行,则会进入TIMED_WAITING状态。

  TERMINATED

  已终止线程的线程状态。

  线程已运行完毕。它的run()方法已正常结束或通过抛出异常而结束。

  线程的终止

  run()方法结束,线程就结束。

Thread中,join()方法的更多相关文章

  1. Thread中join()方法进行介绍

    http://www.cnblogs.com/skywang12345/p/3479275.html https://blog.csdn.net/dabing69221/article/details ...

  2. Thread 的join方法

    package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJo ...

  3. 浅析Thread的join() 方法

    Thread中的 join() 方法在实际开发过程中可能用的不是很多,但是在面试中作为考察基本功知识的扎实与否,经常会被用到.因此,对于 Thread 的 join() 方法进行了一定的研究. 常见的 ...

  4. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  5. (二)线程Thread中的方法详解

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...

  6. 线程Thread中的方法详解(二)

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...

  7. C#中Thread类中Join方法的理解(转载)

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 using System; namespace TestThreadJoin { class Pro ...

  8. python thread的join方法解释

    python的Thread类中提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行.这个方法还可以设定一个timeout参数,避免无休止的等待.因为两个线程顺序完成,看起来象一个 ...

  9. 转载:Java多线程中join方法的理解

    转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...

  10. Java中join()方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...

随机推荐

  1. panda 函数-处理空值

    今天这里谈的函数,以后进行数据分析的时候会经常用到. import numpy as npimport pandas as pdfrom pandas import DataFrame , Serie ...

  2. constructor&object 的联系与对比

    构造函数与对象 构造函数是类中的特殊成员函数,用于为对象分配内存.它可用于为数据成员提供值.创建对象时将调用构造函数.它与类具有相同的名称.构造函数不返回任何值. 构造函数是生成对象的模板,一个构造函 ...

  3. S16课件

    Python之路,Day1 - Python基础1 介绍.基本语法.流程控制 Python之路,Day2 - Python基础2 列表.字典.集合 Python之路,Day3 - Python基础3  ...

  4. 【ecmascript】Javascript 严格模式详解【转】

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  5. C++隐式类类型转化

    隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换 class Person { public: Person(): mName()name, mAge ...

  6. lcx端口转发 linux版

    一.端口转发使用 1.攻击机上执行以下命令 ./lcx -p1 -p2 -m 在本地监听3389端口,并将发送到本机3389端口的数据传递到本机2222端口 2.跳板机上执行以下命令 ./lcx -h ...

  7. Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法

    这里也会遇到一次性关闭所有modal引起阴影遮罩的问题,也就是所有modal都关闭了,但是主页面仍然被阴影遮罩. 这个问题从哪来的,是因为modal叠加,我们点击窗口之外的空白部分,一次性关闭所有mo ...

  8. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  9. iOS中数组遍历的方法及比较

    数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系 ...

  10. IOS开发 arc与非Arc代码的区别

    是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(Man ...