package seday09;

/**
* @author xingsir
* 线程提供了一个方法:void join() ,join可以协调线程之间的同步运行。
* 此方法允许执行这个方法的线程在该方法所属线程后等待,直到该方法所属线程结束后方可继续运行,否则会一致处于 阻塞状态。
* 同步运行:执行有先后顺序
* 异步运行:执行没有先后顺序,多线程就是异步运行的。
*/
public class JoinDemo {
/*
* 例如案例:
* 用线程方式,显示文字,下载图片,显示图片
* 需要显示图片,首先要对图片进行下载,若图片还没有下载完毕就直接展示,此时肯定显展示不出图片。
* 所以需要先下载后显示
*/
private static boolean isFinish = false;//标示图片是否下载完毕

public static void main(String[] args) {
/*
* JDK8之前有一个强制要求(JDK8不强制要求,但是 若存在使用不当情况,编译器仍然会编译失败),
* 当一个方法的局部内部类中引用了这个方法的其他 局部变量时,要求这个变量必须声明为final的,这源自JVM的内存分配问题。
*/
final Thread download =new Thread() {
public void run() {
System.out.println("开始下载图片....");
for(int i=1;i<=100;i++) {//循环到100
System.out.println("下载:"+i+"%");//打印
try {
Thread.sleep(50);//阻塞50毫秒
} catch (InterruptedException e) {
}
}
System.out.println("图片下载完毕!");
isFinish = true;//标示图片已下载完毕
}
};

Thread show = new Thread() {
public void run() {
try {
//显示文字,可以直接显示,异步运行:执行没有先后顺序
System.out.println(">>>开始显示文字...");
Thread.sleep(1000);//阻塞1000毫秒
System.out.println(">>>文字已显示完毕!");

System.out.println(">>>开始显示图片...");
//加载图片之前应当先等待下载线程将图片下载完毕
System.out.println(">>>等待download下载图片...");
download.join();//同步运行:执行有先后顺序,先下载后显示
System.out.println(">>>图片已下载完毕!");

if(!isFinish) {//判断为真
throw new RuntimeException("Error!!图片加载失败!");
}
System.out.println(">>>显示图片完毕!");
} catch (InterruptedException e) {
}
}
};

download.start();//调用
show.start();//调用
}
}

线程提供了一个方法:void join() ,join可以协调线程之间的同步运行。的更多相关文章

  1. 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)

    1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...

  2. 编写一个Java应用程序,该应用程序包括2个类:Print类和主类E。Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身,如: 371 = 33 + 73 + 13。)在主类E的main方法中来 测试类Print

    package zuoye; public class print { void output() { System.out.println("100-999之间的水仙花数是:") ...

  3. 编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package zuoye; public class print1 { String a="abcdefghigklmnopqrstuvwxyz"; String B=" ...

  4. 首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package lianxi; public class Print_1 { int x; Print_1(int x) { this.x = x; } void outPut() { String ...

  5. .编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package com.homework.zw; //类Print部分 public class Print1 { int x; void output() { if(x==1) { for(int ...

  6. 7.编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package com.bao; public class Print1 { int x; void output() { if(x==1) { System.out.println("AB ...

  7. 6.编写一个Java应用程序,该应用程序包括2个类:Print类和主类E。Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身,如: 371 = 33 + 73 + 13。)在主类E的main方法中来 测试类Print。

    Print类: package com.bao; public class Print { int g,s,b; void outPut() { for(int i=100;i<1000;i++ ...

  8. Java多线程 线程状态及转换 wait sleep yield join

    线程的状态转化关系(1). 新建状态(New):新创建了一个线程对象.(2). 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  9. 【spring data jpa】使用spring data jpa时,关于service层一个方法中进行【删除】和【插入】两种操作在同一个事务内处理

    场景: 现在有这么一个情况,就是在service中提供的一个方法是先将符合条件的数据全部删除,然后再将新的条件全部插入数据库中 这个场景需要保证service中执行两步 1.删除 2.插入 这两步自然 ...

随机推荐

  1. 有效的减少代码中太多的if、else?-策略模式

    写这篇文章的目的和上一篇单例模式一样,策略模式也是一种常用的设计模式,太多的if-else不仅看着不太美观而且不好维护,对于自己来说也等于复习了一遍策略模式.先说一下策略 模式的定义: 策略模式封装了 ...

  2. windows和linux的开机顺序

    windows的开机顺序: 启动自检阶段---初始化启动阶段---Boot加载阶段---检测和配置硬件阶段---内核加载阶段---屏幕显示. linux的开机启动顺序: 加载Bios---读取MBR- ...

  3. ASP.NET Core 中的 ObjectPool 对象重用(一)

    前言 对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种 ...

  4. 分布式存储Minio集群环境搭建

    MinIO 分布式集群搭建 分布式 Minio 可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务.由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障. Minio 分布式模式可 ...

  5. Windows的定时任务(Schedule Task)设置

    一.设置 1 点击“开始” 2 点击“控制面板” 3 双击“任务计划” 4 双击“添加任务计划” 5 到了“任务计划向导”界面,点击“下一步” 6 点击“浏览”选择需要定时运行的程序(exe文件,ba ...

  6. python模块StringIO和BytesIO

    StringIO和BytesIO StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创 ...

  7. 关于小码哥kylin

    技术格言: 用双手改变人生,用代码改变世界! 个人网站:http://www.isainttech.com QQ:56619556 Email:dragonsaint@qq.com 微信:kylin1 ...

  8. 在docker中加入加速器的方法

    前提条件:在一台Linux中安装好了docker 目的:在docker中加如这入个加速器的目的,是让docker pull 时能速度快一点,但是好像docker push速度并没有加快. 换句话说,就 ...

  9. 切换控制器的三种手段push modal 切换window的rootViewController

  10. PAT-2019年秋季考试-甲级

    7-1 Forever (20 分) #include <bits/stdc++.h> using namespace std; int N,K,m,number[10]; multima ...