线程join方法 小demo
1.第一个示例:
package cn.threaddemo; public class T implements Runnable { public static int a = 0; @Override
public void run() {
System.out.print("t线程中的a:");
for (int k = 0; k < 5; k++) {
a = a + 1;
System.out.print(" "+a);
}
} public static void main(String[] args) throws Exception {
Runnable r = new T();
Thread t = new Thread(r);
t.start();
/* */
System.out.println("主线程中的a:"+a);
} }
输出结果:
主线程中的a:0
t线程中的a: 1 2 3 4 5
这是因为,当主线程 main方法执行 System.out.println("主线程中的a:"+a); 这条语句时,t 线程还没有真正开始运行,或许正在为它分配资源准备运行。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a); 这个时候得到的结果是a还没有被改变的值0 。
2.Question: 怎样才能让主线程中的输出结果为5, join() 方法提供了这种功能,在第一个代码的基础上进行修改如下:
package cn.threaddemo; public class T1 implements Runnable { public static int a = 0; @Override
public void run() {
System.out.print("t线程中的a:");
for (int k = 0; k < 5; k++) {
a = a + 1;
System.out.print(" "+a);
}
} public static void main(String[] args) throws Exception {
Runnable r = new T1();
Thread t = new Thread(r);
t.start();
t.join();//把线程t强制合并到主线程,使两个线程顺序执行,t线程执行完成后,再接着执行主线程
System.out.println("\n主线程中的a:"+a);
} }
执行结果如下:
分析:thread.Join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
第一个示例中t线程和主线程是交替运行,当主线程中加入t.join();语句后,线程执行顺序变成了:先执行线程t, t线程执行结束后再接着执行主线程,由原来的线程交替并行执行变成了顺序执行。
3. 另外一种方式实现主线程中输出5:让主线程休眠一定时间,这种方式不能保证t线程一定会比主线程先执行完,当主线程设置休眠时间比较长时,可以保证t线程先于主线程完成
当主线程设置休眠时间比较短时,就不一定能保证了
线程join方法 小demo的更多相关文章
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- java线程join方法使用方法简介
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
- python线程join方法
转载:http://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: ...
- 【转】线程join()方法的含义
在很多情况下,主线程生成并启动了子线程,如果子线程里要进行大量的耗时运算,主线程往往将于子线程之前结束,但是如果主线程处理完其它事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后 ...
- [java] java 线程join方法详解
join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...
- 线程join方法详解
执行逻辑:在当前代码块(比如main方法)中的线程A执行了join方法, 那么当代码块(main)执行到join方法时,会停止继续向下执行,一直到线程A执行完毕, main方法才会继续向下执行. 代码 ...
- 线程join方法demo-模拟叫号看病
package cn.chapter4.test5; public class SicknessDemo { /** * 模拟叫号看病 * @param args * * 思路:把普通号看病写在主线程 ...
- 一个自定义线程池的小Demo
在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...
- 线程sleep方法的demo详解
sleep:超时等待指定时间,时间到了之后,重新回到就绪状态,抢到CPU资源后,立马进入运行状态: package com.roocon.thread.t1; public class NewThre ...
随机推荐
- 42 Bing Search Engine Hacks
42 Bing Search Engine Hacks November 13, 2010 By Ivan Remember Bing, the search engine Microsoft lau ...
- JS-闭包(Closures)和let声明块级作用域变量
闭包: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures 闭包是函数和声明该函数的词法环境的组合. let: https ...
- vue中的导航钩子
//钩子 登录拦截 router.beforeEach((to, from, next) => { const sessionToken = window.sessionStorage.getI ...
- 测开之路八十五:python处理csv文件
写入csv文件 一:写入字典 二:写入普通数据 读取: 第一种:普通读取 第二种:读取csv并用namedtuple映射列名,类似于使用类的实例 第三种:字典形式 import csvfrom col ...
- postgresql中实现按周统计详解
SELECT EXTRACT(DOW FROM CURRENT_DATE); 执行结果如下. 这个SQL语句的意思就是计算当前日期是一周中的第几天. EXTRACT(DOW FROM CURREN ...
- 从零搭建一个Redis服务
前言 自己在搭建redis服务的时候碰到一些问题,好多人只告诉你怎么成功搭建,但是并没有整理过程中遇到的问题,所有楼主就花了点时间来整理下. linux环境安装redis 安装中的碰到的问题和解决办法 ...
- 所有硬币组合问题——动态规划hdu2069
Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cen ...
- SEC2- - mysql 的介绍
一.mysql的背景 前身属于瑞典的一家公司,mysql AB 08年被sun公司收购 09年被oracle公司收购 二.mysql的优点 1. 开源免费成本低 2. 性能高,移植性好 3. 体积 ...
- JS验证数字
//1.验证数字 var reg = new RegExp("^[0-9]*$"); //var reg = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+ ...
- docker安装及基本命令
Ubuntu安装docker sudo apt-get install docker.io Centos安装docker # 更新系统软件包 yum -y upgrade # 官方下载地址 curl ...