`
HelloSure
  • 浏览: 308159 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

多线程例子:join

阅读更多
package sure;

import java.util.Random;

public class MultThread {  

	    public static void main(String[] args) {
	        System.out.println("in " + Thread.currentThread().getName());
	        long start = System.currentTimeMillis();
	        CounterThread[] ct = new CounterThread[3];
	        for (int i = 0; i < ct.length; i++) {
	            ct[i] = new CounterThread();
	            ct[i].start();
//	            try {
//	                ct[i].join();
//	            } catch (InterruptedException e) {
//	                e.printStackTrace();
//	            }
	        }
	        long end = System.currentTimeMillis();
	        System.out.println("join total time = " + (end - start));
	        int result = 0;
	        for (int j = 0; j < ct.length; j++) {
	            result += ct[j].getResult();
	        }
	        System.out.println("the result is " + result);

	    }

	}

	class CounterThread extends Thread {

	    public CounterThread() {
	    }

	    private int result;

	    public int getResult() {
	        return result;
	    }

	    public void run() {
	        try {
	            int time = (new Random().nextInt() >>> 1) % 5000;
	            Thread.sleep(time);
	            System.out.println(Thread.currentThread().getName()
	                    + " is blocked for " + time + "ms");
	        } catch (InterruptedException ex) {

	        }
	        result = 5;
	    }
	}

控制台结果是:
in main
join total time = 0
the result is 0
Thread-2 is blocked for 897ms
Thread-0 is blocked for 1334ms
Thread-1 is blocked for 4623ms

运行的直观感受是:
前三行一瞬间就出来了,就是说main线程没有收到任何阻塞,一下子就运行结束了。
其实这个时候三个子线程也在运行,不过sleep的阻塞时间有长短,因此就一个一个的执行完打印出了后面三行。

但是如果把//那几行放开,则结果变为:
in main
Thread-0 is blocked for 4734ms
Thread-1 is blocked for 2307ms
Thread-2 is blocked for 4562ms
join total time = 11609
the result is 15

运行的直观感受是:
第一行出来之后过了4734ms出现第二行,又过了2307ms出现第三行,又过了4562ms后面都出来了。
其实这就表明了join()的用处,就是:
比如在main线程中调用thread-0.join(),那么main线程就会阻塞,等到thread-0执行结束之后再继续运行main线程。
因此这个例子的代码实现了一个多线程进行汇总的功能,很有意思。


再来一个例子,也可以帮助加深理解:
public class Test {
	public static void main(String[] args) {
		Thread t1 = new MyThread1();
		t1.start();

		for (int i = 0; i < 20; i++) {
			System.out.println("主线程第" + i + "次执行!");
			if (i > 2)
				try {
					// t1线程合并到主线程中,主线程停止执行过程,转而执行t1线程,直到t1执行完毕后继续。
					t1.join();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		}
	}
}

class MyThread1 extends Thread {
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("线程1第" + i + "次执行!");
		}
	}
}

控制台结果为:
线程1第0次执行!
线程1第1次执行!
线程1第2次执行!
线程1第3次执行!
线程1第4次执行!
线程1第5次执行!
主线程第0次执行!
线程1第6次执行!
主线程第1次执行!
主线程第2次执行!
主线程第3次执行!
线程1第7次执行!
线程1第8次执行!
线程1第9次执行!
主线程第4次执行!
主线程第5次执行!
主线程第6次执行!
主线程第7次执行!
主线程第8次执行!
主线程第9次执行!
主线程第10次执行!
主线程第11次执行!
主线程第12次执行!
主线程第13次执行!
主线程第14次执行!
主线程第15次执行!
主线程第16次执行!
主线程第17次执行!
主线程第18次执行!
主线程第19次执行!

在主线程第3次执行!之后,会先执行完线程1,再返回主线程进行执行。
分享到:
评论

相关推荐

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

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

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

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

    浅谈Python中threading join和setDaemon用法及区别说明

    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。 1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子...

    linux系统编程之线程.zip

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

    C++11/14 线程中使用Lambda函数的方法

    多线程中使用lambda 在本篇文章中,主要介绍lambda函数在多线程中的使用。 先从下面的例子开始吧: #include #include int main() { std::thread t([]() { std::cout &lt;&lt; thread function\n; }); ...

    python使用Thread的setDaemon启动后台线程教程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon(True): 当主线程退出时,...

    ThreadDemo3.rar

    多线程的API例子,包含sleep、yeild、获取线程id、获取线程名称,设置线程上下文加载器,线程interrupt,线程join,关闭线程等操作

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

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

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

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    而在1.x版本中,由于静态分配环境变量,多线程技术是不被允许的(只有一个线程可以用这个环  境变量调用远程方法或处理请求信息)。  4 准备工作  要开始用gSOAP创建一个web服务应用, 你需要:  一个C/C++编译器....

    java线程实例

    java线程实例,运用thread线程进行学习。有更多例子可以咨询。

    java-core-learning-example:关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践

    Java核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。未完成模块:阿里Java手册,java8,注解,fork / join,加解密...

    jdk7新特性jdk8新特性

    // fork/join: ForkJoinTask&lt;Long&gt; task = new SumTask(array, 0, array.length); long startTime = System.currentTimeMillis(); Long result = ForkJoinPool.commonPool().invoke(task); long endTime = ...

    并行计算课程设计(代码+执行文件+文档)

    利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 ...

    具有可单独重用节点的免等待 spsc 链表队列

    例子使用队列在线程之间发送值:use llq:: {Node, Queue};let (mut producer,mut consumer)= Queue::&lt;usize&gt;::new ().split ();producer.push (Node::new (0 ));producer.push (Node::new (1 ));producer.push (Node...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 ...

    疯狂JAVA讲义

    5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 5.8.1 使用继承的注意点 155 5.8.2 利用组合实现复用 156 学生提问:使用组合关系来实现复用时,需要创建...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 ...

Global site tag (gtag.js) - Google Analytics