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多线程(七)-线程之间的 协作
对于多线程之间的共享受限资源,我们是通过锁(互斥)的方式来进行保护的,从而避免发生受限资源被多个线程同时访问的问题.那么线程之间既然有互斥,那么也会有协作.线程之间的协作也是必不可少的,比如 盖个商场 ...
随机推荐
- enode
WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例 WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例 https://mp.weixin.qq ...
- Unity3D对安卓盒子的支持
一般的安卓盒子主要按键包含 1.方向键:上下左右 2.确认 3.返回 4.音量(Unity无法获取),须要在安卓层将事件发上来,KeyCode = 24,25 基本的函数是 if (Input.Get ...
- STM32F4 SPI with DMA
STM32F4 SPI with DMA A few people have requested code, so I thought I’d post the code showing how I’ ...
- 在阿里云里申请免费Https证书SSL
在阿里云控制台:安全(云盾)->证书服务->购买证书里(地址:https://common-buy.aliyun.com/?spm=5176.2020520163.cas.1.zTLyhO ...
- [翻译] 10 个实用的 Git 高级命令
1. 输出最后一次提交的改变 这个命令,我经常使用它 来发送其他没有使用 git 的人来检查或者集成所修改的.它会输出最近提交的修改内容到一个 zip 文件中. git archive -o ../u ...
- List、Set、Map 和 Queue 之间的区别
list 和set 有共同的父类 它们的用法也是一样的 唯一的不太就是set中不能有相同的元素 list中可以list和set的用途非常广泛 list可以完全代替数组来使用map 是独立的合集 它使用 ...
- ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析
攻击代码网址:http://www.exploit-db.com/exploits/394/ 1.执行环境: 1.ProFTPD 1.3.0/1.3.0a 2.编译ProFTPD时.--enable- ...
- 在ASP.NET MVC中使用Knockout实践08,使用foreach绑定集合
本篇体验使用 foreach 绑定一个Product集合. 首先使用构造创建一个View Model. var Product = function(data) { this.name = ko.ob ...
- indy10的idHttpServer发送流
indy10的idHttpServer发送流 先看源码: procedure TIdIOHandler.Write(AStream: TStream; ASize: TIdStreamSize = 0 ...
- how to use fiddler and wireshark to decrypt ssl
原文地址: http://security14.blogspot.jp/2010/07/how-to-use-fiddler-and-wireshark-to.html Requirements2 C ...