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多线程(七)-线程之间的 协作
对于多线程之间的共享受限资源,我们是通过锁(互斥)的方式来进行保护的,从而避免发生受限资源被多个线程同时访问的问题.那么线程之间既然有互斥,那么也会有协作.线程之间的协作也是必不可少的,比如 盖个商场 ...
随机推荐
- 青客宝团队Consul内部分享ppt
青客宝团队Consul内部分享ppt https://mp.weixin.qq.com/s?src=3×tamp=1503647705&ver=1&signatu ...
- JAVA泛型中的有界类型(extends super)(转)
JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...
- securecrt中文乱码以及ubuntu设置locale
参考文献 http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale http://www.bootf.com/547.html 强烈建议 ubuntu下面不 ...
- linux网络编程:splice函数和tee( )函数高效的零拷贝
splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...
- C#内存映射文件消息队列实战演练(MMF—MQ)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- .NET轻量级ORM组件Dapper修炼手册
一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需 ...
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- SQL Server 2000 绿色精简版gsql适用于xp/win7/win8/win10
老的程序员肯定都用过sql2000数据库,我在2006-2010年之间,做的不少网站也都是sql2000数据库的,但是后来随着mysql的兴起,就逐渐不再使用sql数据库了.但是最近有个客户的网站要修 ...
- .NET对象的创建、垃圾回收、非托管资源的手动处理
本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没 ...
- Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BA ...