`

java多线程join的作用与用法

阅读更多

        对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever。字面意思是等待一段时间直到这个线程死亡。

        有这样一种应用场景,主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行(如需要获得子线程的结果信息)

        面对这样的场景,我们有几种思路:

        1.启动子线程后,让主线程sleep一段时间

         这种方式最不靠谱,因为我们不知道要让主线程休眠多长时间

        实例1:

package com.bijian.study.thread;

public class MyThread extends Thread {

	boolean negative = true;
	double pi; // Initializes to 0.0, by default

	public void run() {
		for (int i = 3; i < 100000; i += 2) {
			
			if (negative)
				pi -= (1.0 / i);
			else
				pi += (1.0 / i);
			negative = !negative;
		}
		pi += 1.0;
		pi *= 4.0;
		System.out.println("Finished calculating PI");
	}
}

        主线程:

package com.bijian.study.thread;

public class MainThread {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		try {
			Thread.sleep(10); // Sleep for 10 milliseconds
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
	}
}

         运行结果:

Finished calculating PI
pi = 3.1415726535897894

 

         2.sleep一段时间不靠谱,于是还可以来个循环,判断子线程是否还活着

        实例2(修改实例1的主线程):

package com.bijian.study.thread;

public class MainThread2 {

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		while (mt.isAlive())
			try {
				Thread.sleep(10); // Sleep for 10 milliseconds
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		System.out.println("pi = " + mt.pi);
	}
}

         运行结果:

Finished calculating PI
pi = 3.1415726535897894

         这样,效果是达到了,但在主线程里写个循环,不是高性能的方法。

 

         3.join很好的解决此应用场景

        实例3(修改实例1的主线程):

package com.bijian.study.thread;

public class MainThread3 {
	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
		try {
			mt.join();
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
	}
}

         运行结果:

Finished calculating PI
pi = 3.1415726535897894

 

        扩展下实例3,就能很好的解决主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行。如下所示:

          实例4:

          1.新建一个子线程

package com.bijian.study.thread;

public class MyThread2 extends Thread {

	boolean negative = true;
	double res; // Initializes to 0.0, by default

	public void run() {
		for (int i = 1; i < 100; i += 2) {
			if (negative)
				res -= (1.0 / i);
			else
				res += (1.0 / i);
			negative = !negative;
		}
		System.out.println("Finished calculating res");
	}
}

         2.修改实例1的主线程

package com.bijian.study.thread;

public class MainThread3 {
	public static void main(String[] args) {
		
		//创建并启动子线程1
		MyThread mt = new MyThread();
		mt.start();
		
		//创建并启动子线程2
		MyThread2 mt2 = new MyThread2();
		mt2.start();
		try {
			mt.join();
			mt2.join();
		} catch (InterruptedException e) {
		}
		System.out.println("pi = " + mt.pi);
		System.out.println("res = " + mt2.res);
	}
}

         运行结果:

Finished calculating res
Finished calculating PI
pi = 3.1415726535897894
res = -0.7803986631477527
分享到:
评论

相关推荐

    深入浅出 Java 多线程.pdf

    在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    Java线程中wait、await、sleep、yield、join用法汇总,文章里面总结了这些关键字的用法,并且里面带有源码帮助分析用法,此一文就可以理解这些关键字用法,推荐拥有

    Java学习源码Java多线程的代码

    在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    多线程机制

    7、 浅析 Java Thread.join() : java多线程实现主线程等待所有子线程执行完毕 16 8、 线程运行中抛出异常的处理 19 9、 Callable 有返回值的线程 20 10、 Callable结合FutureTask的多线程使用(免打扰模式) 24

    Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait...

    Java多线程教程吐血整理干货.md

    多线程 进程和线程 并发和并行 多线程的利弊 什么是上下文切换? 线程的优先级 线程的几种状态 sleep方法和wait方法的区别 stop,suspend,resume等方法为什么会被遗弃 interrupt,interrupted,isInterrupted方法区别 ...

    Java实验指导书_多线程

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

    java基本教程之join方法详解 java多线程教程

    本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧

    Java多线程中关于join方法的使用实例解析

    本文通过实例代码给大家实例介绍了Java多线程中关于join方法的使用,非常不错,具有参考借鉴价值,需要的朋友参考下

    Java多线程详解

    文章目录1、进程与线程2、创建多线程2.1、继承Thread类2.2、实现Runnable接口2.3、使用匿名内部类实现2.4、实现Runnable接口的好处2.5、使用Callable和Future创建线程3、线程的生命周期4、几种特殊线程4.1、join线程...

    使用Java多线程实现下载多个文件.txt

    这段代码实现了一个下载器,可以同时下载多个文件。其中,构造函数MultiThreadDownloader接收一个URL数组和两个整数数组作为参数,分别表示每个URL的起始...最后,通过调用每个线程的join()方法等待所有线程执行完毕。

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

    本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多线程模拟猴子采花 使用同步方法模拟购票 使用多线程模拟购物订单生成 使用 ThreadLocal 类模拟银行取款 Java高级...

    java多线程Thread的实现方法代码详解

    主要介绍了java多线程Thread的实现方法代码详解,涉及start(),run(),stop(),interrupt(),isInterrupted(),join()和join(long millis)等方法的介绍,具有一定借鉴价值,需要的朋友可以了解下。

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

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

    RexCrawler:一个极简的 Java 多线程爬虫 API

    一个用于 Java 的简约多线程爬虫 API。 分散其简约的结构,此爬虫基于 Java ForkJoin 框架,该框架允许 RexCrawler 通过将其本地工作负载分区来按需创建其他守护进程。 这种方法的一个关键好处是更好地控制粒度和更...

    Java线程

    目录 理解线程的概念 通过Thread直接创建子线程 实现Runnable接口创建自线程 线程状态(创建、就绪、执行、阻塞、终止...每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM实际上就是在操作系统中启

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    线程的基本概念、线程类...在Java中,可以使用Thread类的join()方法实现线程的合并。 线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)

    Java开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    JavaEE基础教程 多线程PPT教案学习.pptx

    在 Java 中,可以使用 Thread 类的 start () 方法启动线程,使用 join () 方法等待线程的结束。 7. 多线程编程的优点:多线程编程可以提高程序的执行效率,提高用户体验,实现程序的并发执行。但是,多线程编程也...

Global site tag (gtag.js) - Google Analytics