java多线程之间的顺序问题
java 多线程:
这样写有问题的:这样写可以的:
package com.test; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
* @Author stono
* @Date 2018/8/28 下午2:52
*/
public class NULL {
public static void doWait(CountDownLatch countDownLatch, int count) {
while (true) {
long nowCount = countDownLatch.getCount();
if (nowCount != count) {
try {
countDownLatch.await(1L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
countDownLatch.countDown();
} public static void main(String[] args) { final CountDownLatch countDownLatch = new CountDownLatch(3);
System.out.println("start");
new Thread(new Runnable() {
public void run() {
//此处需要执行某代码
doWait(countDownLatch, 2);
System.out.println("step 2");
} }).start();
doWait(countDownLatch, 3);
System.out.println("step 1");
new Thread(new Runnable() {
public void run() {
//此处需要执行某代码
doWait(countDownLatch, 1);
System.out.println("step 3");
}
}).start();
doWait(countDownLatch, 0);
System.out.println("end");
}
//请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end }
可以多用几个就不用循环了:
package com.test; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
* @Author stono
* @Date 2018/8/28 下午2:52
*/
public class NULL3 { public static void main(String[] args) throws InterruptedException { final CountDownLatch downLatch1 = new CountDownLatch(1);
final CountDownLatch downLatch2 = new CountDownLatch(1);
final CountDownLatch downLatch3 = new CountDownLatch(1); System.out.println("start");
new Thread(new Runnable() {
public void run() {
//此处需要执行某代码
try {
downLatch1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("step 2");
downLatch2.countDown();
} }).start();
System.out.println("step 1");
downLatch1.countDown();
new Thread(new Runnable() {
public void run() {
//此处需要执行某代码
try {
downLatch2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("step 3");
downLatch3.countDown();
}
}).start();
downLatch3.await();
System.out.println("end");
}
//请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end }
或者:
public static void main(String[] args) {
System.out.println("start");
final StringBuffer sb = new StringBuffer();
new Thread(new Runnable() {
@Override
public void run() {
while (sb.toString().equals("1")) {
System.out.println("step 2");
sb.append("2");
}
}
}).start();
System.out.println("step 1");
sb.append("1");
new Thread(new Runnable() {
@Override
public void run() {
while (sb.toString().equals("12")) {
System.out.println("step 3");
sb.append("3");
}
}
}).start();
while (sb.toString().equals("123")) {
System.out.println("end");
}
}
可以用phaser:
package com.test; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit; /**
* @Author stono
* @Date 2018/8/28 下午2:52
*/
public class NULL2 { public static void main(String[] args) { final Phaser phaser2= new Phaser(2);
final Phaser phaser3 = new Phaser(2);
final Phaser phaser4 = new Phaser(2); System.out.println("start");
new Thread(new Runnable() { public void run() { //此处需要执行某代码
phaser2.arriveAndAwaitAdvance();
System.out.println("step 2");
phaser3.arriveAndAwaitAdvance(); } }).start();
System.out.println("step 1");
phaser2.arriveAndAwaitAdvance();
new Thread(new Runnable() { public void run() {
//此处需要执行某代码
phaser3.arriveAndAwaitAdvance();
System.out.println("step 3");
phaser4.arriveAndAwaitAdvance(); } }).start();
phaser4.arriveAndAwaitAdvance();
System.out.println("end");
} //请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end }
java多线程之间的顺序问题的更多相关文章
- JAVA多线程之间共享数据BlockingQueue介绍
在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...
- java多线程之间的通信
目的 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运行呢? 四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各 ...
- java多线程通信方式之一:wait/notify
java多线程之间的通信方式有多种: 1.wait(),notify(),notifyAll()方法;2.join()方法;3.通过volatile共享内存的方式进行线程通信的;4.interrupt ...
- Java 多线程:基础
Java 多线程:基础 作者:Grey 原文地址: 博客园:Java 多线程:基础 CSDN:Java 多线程:基础 顺序.并行与并发 顺序(sequential)用于表示多个操作『依次』处理.比如把 ...
- java多线程的协作
java多线程之间相互协作,主要有join, yield, interupt(), sleep, wait, notify, notifyAll; join: 在一个线程A的代码里面调用另 ...
- java保证多线程的执行顺序
1. java多线程环境中,如何保证多个线程按指定的顺序执行呢? 1.1 通过thread的join方法保证多线程的顺序执行, wait是让主线程等待 比如一个main方法里面先后运行thread1, ...
- 应用java多线程实现server端与多client之间的通信
应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和se ...
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
http://blog.csdn.net/a352193394/article/details/39503857 Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...
- java多线程(七)-线程之间的 协作
对于多线程之间的共享受限资源,我们是通过锁(互斥)的方式来进行保护的,从而避免发生受限资源被多个线程同时访问的问题.那么线程之间既然有互斥,那么也会有协作.线程之间的协作也是必不可少的,比如 盖个商场 ...
随机推荐
- MongoDB数组修改器更新数据(转)
MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用 ...
- px 与 dp, sp换算公式?(转)
PPI = Pixels per inch,每英寸上的像素数,即 "像素密度" xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 (baseline) ldpi: 0. ...
- SGU 200. Cracking RSA (高斯消元求自由变元个数)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=200 200. Cracking RSA time limit per test: ...
- HP Notebook PCs - Updating the BIOS
HP Notebook PCs - Updating the BIOS Updating the BIOS Updating the BIOS when Windows does not start ...
- 异步图片下载引擎(升级版——ExecutorService+handler)
[Android分享] 异步图片下载引擎(升级版——ExecutorService+handler) [复制链接] 皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级 2 ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- Android之防止反编译技巧
1. 判断程序是否运行在模拟器上 boolean isRunningInEmualtor() { boolean qemuKernel = false; Process process = null; ...
- 摩拜单车模式优于OFO双向通信才能被认可
马化腾 :摩拜单车模式优于OFO双向通信才能被认可 2017-06-20 00:12 最近共享单车里最头条的新闻是 悟空单车宣布退出竞争,并全部退还投资款和押金以及余额.运营才5个月,成为第一家倒下的 ...
- SVG.js 元素操作整理(一)
一.属性操作Attributes var draw = SVG('svg1').size(300, 300); //attr() 属性操作 //设置属性的值 var rect = draw.rect( ...
- [转]Linux的SOCKET编程详解
From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...