`
周凡杨
  • 浏览: 230368 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程编程之join()方法

阅读更多

现实生活中,有些工作是需要团队中成员依次完成的,这就涉及到了一个顺序问题。现在有T1、T2、T3三个工人,如何保证T2在T1执行完后执行,T3在T2执行完后执行?

问题分析:首先问题中有三个实体,T1、T2、T3, 因为是多线程编程,所以都要设计成线程类。关键是怎么保证线程能依次执行完呢?

 

Java实现过程如下:

public class T1 implements Runnable{

	@Override
	public void run() {
	    try {
			System.out.println("T1开始工作.....");
			Thread.sleep(RandomUtils.nextInt(300));
			System.out.println("T1结束工作>>>>>");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 

package thread.join.demo1;

import org.apache.commons.lang.math.RandomUtils;

public class T2 implements Runnable{

	@Override
	public void run() {
		try{
			System.out.println("T2开始工作.....");
			Thread.sleep(RandomUtils.nextInt(300));
			System.out.println("T2结束工作>>>>>");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 

public class T3 implements Runnable{

	@Override
	public void run() {
		try{
			System.out.println("T3开始工作.....");
			Thread.sleep(RandomUtils.nextInt(300));
			System.out.println("T3结束工作>>>>>");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 

public class Main {

	public static void main(String[] args){
		
		Thread t1 = new Thread(new T1());
		Thread t2 = new Thread(new T2());
		Thread t3 = new Thread(new T3());
		
		t1.start();
		t2.start();
		t3.start();
		
		System.out.println("T1、T2、T3依次工作结束.");
	}

}
 

运行结果:

T1开始工作.....

T2开始工作.....

T3开始工作.....

T1T2T3依次工作结束.

T3结束工作>>>>>

T2结束工作>>>>>

T1结束工作>>>>>

 

说明:从结果来看,T1T2T3并没有依次执行。查看JDK文档,java.lang.Thread 类有三个join()方法,其解释为:等待该线程终止。试用它来解决该问题……

 

Main.java修改如下:

public class Main {

	public static void main(String[] args) throws InterruptedException {
		
		Thread t1 = new Thread(new T1());
		Thread t2 = new Thread(new T2());
		Thread t3 = new Thread(new T3());
		
		t1.start();
		t1.join();
		
		t2.start();
		t2.join();
		
		t3.start();
		t3.join();
		
		System.out.println("T1、T2、T3依次工作结束.");
	}

}

 

 

运行结果:

T1开始工作.....

T1结束工作>>>>>

T2开始工作.....

T2结束工作>>>>>

T3开始工作.....

T3结束工作>>>>>

T1T2T3依次工作结束.

 

 

哈,解决了!

 

 

查看jdk源码,其中join方法代码片断如下:

 

/**
     * Waits at most <code>millis</code> milliseconds for this thread to 
     * die. A timeout of <code>0</code> means to wait forever. 
     *
     * @param      millis   the time to wait in milliseconds.
     * @exception  InterruptedException if any thread has interrupted
     *             the current thread.  The <i>interrupted status</i> of the
     *             current thread is cleared when this exception is thrown.
     */
    public final synchronized void join(long millis) 
    throws InterruptedException {
	long base = System.currentTimeMillis();
	long now = 0;

	if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
	}

	if (millis == 0) {
	    while (isAlive()) {
		wait(0);
	    }
	} else {
	    while (isAlive()) {
		long delay = millis - now;
		if (delay <= 0) {
		    break;
		}
		wait(delay);
		now = System.currentTimeMillis() - base;
	    }
	}
    } 

 

 

单纯从代码上看如果线程被生成了,但还未被起动,isAlive()将返回false,调用它的join()方法是没有作用的,将直接继续向下执行。Main.java类中,t1.join()是判断t1线程的状态,如果t1isActive()方法返回false,在 t1.join(),这一点就不用阻塞了,可以继续向下进行了。从源码里看,wait方法中有参数,也就是不用唤醒谁,只是不再执行wait,向下继续执行而已。join()方法中,对于isAlive()wait()方法的作用对象是个比较让人困惑的问题:

isAlive()方法的签名是:public final native boolean isAlive(),也就是说isAlive()是判断当前线程的状态,也就是t1的状态。

 

 

 

 

 

1
1
分享到:
评论

相关推荐

    java多线程编程之join方法的使用示例

    join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法

    分而治之,ForkJoin,多线程编程

    分而治之,ForkJoin,多线程编程

    JAVA多线程编程详解-详细操作例子

    本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...

    c++11多线程编程

    c++11多线程库的使用,主要介绍了thread类中的构造函数 join函数和detach函数的使用方式

    对python 多线程中的守护线程与join的用法详解

    多线程:在同一个时间做多件事 守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程...

    Java实验指导书_多线程

    Java实验指导书_多线程 《Java语言程序设计基础教程》 上机实验指导手册 异常处理 【目的】 ①线程的创建和运行 ②Thread类的sleep、join等方法的使用 ③线程同步

    Linux系统编程之线程同步

    所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。 因此,即使有了mutex,如果有线程不按规则来访问数据,依然会造成...

    《Python基础实训教程》第3章-多线程.pptx

    第3章 多线程 《Python基础实训教程》第3章-多线程全文共23页,当前为第1页。... 3.2.1 Thread方法 Python实现线程创建是利用threading模块完成,开展多线程编程需要提前导入该模块,如: import threading 利用

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    Python多线程编程(三):threading.Thread类的重要函数和方法

    主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下

    Python多线程编程简单介绍

    创建线程 格式如下 复制代码 代码如下: threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 这个构造器必须用关键字传参调用 ...join(timeout=None) 程序挂起,直到线程结束;如果给了 timeout

    linux多线程演示代码.rar_linux 多线程_since3pj

    基于linux的多线程编程,包括thread_create thread_join thread_string等

    多线程API.zip

    常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数

    linux系统编程之线程.zip

    所以,多线程环境中,应尽量少用,或者不使用exit函数,取而代之使用pthread_exit函数,将单个线程退出。任何线程里exit导致进程退出,其他线程未工作结束,主控线程退出时不能return或exit。 另注意,pthread_exit...

    JAVA高质量并发详解,多线程并发深入讲解

    本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...

    Java高级程序设计-多线程(二).pptx

    3.1 线程安全 多线程编程时,由于系统对线程的调度具有一定的随机性,所以,使用多个线程操作同一个数据时,容易出现线程安全问题。 当多个线程访问同一个资源时,如果控制不好,也会造成数据的不正确性。 以银行取...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    5操作系统实验报告.doc

    报 告 课程名称: 线程控制实验 专业班级: 学 号: 姓 名: 报告日期: 2013年12月03日 计算机科学与技术学院 线程控制实验 一、目的和要求 通过本实验掌握在 Linux操作系统中遵循 Posix线程标准接口进行多线程程序...

    linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能  多线程的一些小知识: 一个应用程序可以启动若干个线程。 线程(Lightweight Process,LWP),是程序执行的最小单元。 一般一个最简单的...

    Java 7并发编程实战手册

    如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行...

Global site tag (gtag.js) - Google Analytics