java 多线程:

这样写有问题的:这样写可以的:

  1. package com.test;
  2.  
  3. import java.util.concurrent.CountDownLatch;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. /**
  7. * @Author stono
  8. * @Date 2018/8/28 下午2:52
  9. */
  10. public class NULL {
  11. public static void doWait(CountDownLatch countDownLatch, int count) {
  12. while (true) {
  13. long nowCount = countDownLatch.getCount();
  14. if (nowCount != count) {
  15. try {
  16. countDownLatch.await(1L, TimeUnit.SECONDS);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. } else {
  21. break;
  22. }
  23. }
  24. countDownLatch.countDown();
  25. }
  26.  
  27. public static void main(String[] args) {
  28.  
  29. final CountDownLatch countDownLatch = new CountDownLatch(3);
  30. System.out.println("start");
  31. new Thread(new Runnable() {
  32. public void run() {
  33. //此处需要执行某代码
  34. doWait(countDownLatch, 2);
  35. System.out.println("step 2");
  36. }
  37.  
  38. }).start();
  39. doWait(countDownLatch, 3);
  40. System.out.println("step 1");
  41. new Thread(new Runnable() {
  42. public void run() {
  43. //此处需要执行某代码
  44. doWait(countDownLatch, 1);
  45. System.out.println("step 3");
  46. }
  47. }).start();
  48. doWait(countDownLatch, 0);
  49. System.out.println("end");
  50. }
  51. //请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end
  52.  
  53. }

可以多用几个就不用循环了:

  1. package com.test;
  2.  
  3. import java.util.concurrent.CountDownLatch;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. /**
  7. * @Author stono
  8. * @Date 2018/8/28 下午2:52
  9. */
  10. public class NULL3 {
  11.  
  12. public static void main(String[] args) throws InterruptedException {
  13.  
  14. final CountDownLatch downLatch1 = new CountDownLatch(1);
  15. final CountDownLatch downLatch2 = new CountDownLatch(1);
  16. final CountDownLatch downLatch3 = new CountDownLatch(1);
  17.  
  18. System.out.println("start");
  19. new Thread(new Runnable() {
  20. public void run() {
  21. //此处需要执行某代码
  22. try {
  23. downLatch1.await();
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. System.out.println("step 2");
  28. downLatch2.countDown();
  29. }
  30.  
  31. }).start();
  32. System.out.println("step 1");
  33. downLatch1.countDown();
  34. new Thread(new Runnable() {
  35. public void run() {
  36. //此处需要执行某代码
  37. try {
  38. downLatch2.await();
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. System.out.println("step 3");
  43. downLatch3.countDown();
  44. }
  45. }).start();
  46. downLatch3.await();
  47. System.out.println("end");
  48. }
  49. //请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end
  50.  
  51. }

或者:

  1. public static void main(String[] args) {
  2. System.out.println("start");
  3.  
  4. final StringBuffer sb = new StringBuffer();
  5. new Thread(new Runnable() {
  6. @Override
  7. public void run() {
  8. while (sb.toString().equals("1")) {
  9. System.out.println("step 2");
  10. sb.append("2");
  11. }
  12. }
  13. }).start();
  14.  
  15. System.out.println("step 1");
  16. sb.append("1");
  17.  
  18. new Thread(new Runnable() {
  19. @Override
  20. public void run() {
  21. while (sb.toString().equals("12")) {
  22. System.out.println("step 3");
  23. sb.append("3");
  24. }
  25. }
  26. }).start();
  27.  
  28. while (sb.toString().equals("123")) {
  29. System.out.println("end");
  30. }
  31. }

可以用phaser:

  1. package com.test;
  2.  
  3. import java.util.concurrent.CountDownLatch;
  4. import java.util.concurrent.Phaser;
  5. import java.util.concurrent.TimeUnit;
  6.  
  7. /**
  8. * @Author stono
  9. * @Date 2018/8/28 下午2:52
  10. */
  11. public class NULL2 {
  12.  
  13. public static void main(String[] args) {
  14.  
  15. final Phaser phaser2= new Phaser(2);
  16. final Phaser phaser3 = new Phaser(2);
  17. final Phaser phaser4 = new Phaser(2);
  18.  
  19. System.out.println("start");
  20. new Thread(new Runnable() {
  21.  
  22. public void run() {
  23.  
  24. //此处需要执行某代码
  25. phaser2.arriveAndAwaitAdvance();
  26. System.out.println("step 2");
  27. phaser3.arriveAndAwaitAdvance();
  28.  
  29. }
  30.  
  31. }).start();
  32. System.out.println("step 1");
  33. phaser2.arriveAndAwaitAdvance();
  34. new Thread(new Runnable() {
  35.  
  36. public void run() {
  37. //此处需要执行某代码
  38. phaser3.arriveAndAwaitAdvance();
  39. System.out.println("step 3");
  40. phaser4.arriveAndAwaitAdvance();
  41.  
  42. }
  43.  
  44. }).start();
  45. phaser4.arriveAndAwaitAdvance();
  46. System.out.println("end");
  47. }
  48.  
  49. //请添加部分代码,使得代码的输出顺序固定为start,step1,step2,step3,end
  50.  
  51. }

java多线程之间的顺序问题的更多相关文章

  1. JAVA多线程之间共享数据BlockingQueue介绍

    在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...

  2. java多线程之间的通信

    目的 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运行呢? 四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各 ...

  3. java多线程通信方式之一:wait/notify

    java多线程之间的通信方式有多种: 1.wait(),notify(),notifyAll()方法;2.join()方法;3.通过volatile共享内存的方式进行线程通信的;4.interrupt ...

  4. Java 多线程:基础

    Java 多线程:基础 作者:Grey 原文地址: 博客园:Java 多线程:基础 CSDN:Java 多线程:基础 顺序.并行与并发 顺序(sequential)用于表示多个操作『依次』处理.比如把 ...

  5. java多线程的协作

    java多线程之间相互协作,主要有join,  yield,  interupt(),  sleep,  wait,  notify,  notifyAll; join: 在一个线程A的代码里面调用另 ...

  6. java保证多线程的执行顺序

    1. java多线程环境中,如何保证多个线程按指定的顺序执行呢? 1.1 通过thread的join方法保证多线程的顺序执行, wait是让主线程等待 比如一个main方法里面先后运行thread1, ...

  7. 应用java多线程实现server端与多client之间的通信

    应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和se ...

  8. Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型

    http://blog.csdn.net/a352193394/article/details/39503857  Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...

  9. java多线程(七)-线程之间的 协作

    对于多线程之间的共享受限资源,我们是通过锁(互斥)的方式来进行保护的,从而避免发生受限资源被多个线程同时访问的问题.那么线程之间既然有互斥,那么也会有协作.线程之间的协作也是必不可少的,比如 盖个商场 ...

随机推荐

  1. 青客宝团队Consul内部分享ppt

    青客宝团队Consul内部分享ppt   https://mp.weixin.qq.com/s?src=3&timestamp=1503647705&ver=1&signatu ...

  2. JAVA泛型中的有界类型(extends super)(转)

    JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  3. securecrt中文乱码以及ubuntu设置locale

    参考文献 http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale http://www.bootf.com/547.html 强烈建议 ubuntu下面不 ...

  4. linux网络编程:splice函数和tee( )函数高效的零拷贝

    splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...

  5. C#内存映射文件消息队列实战演练(MMF—MQ)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  6. .NET轻量级ORM组件Dapper修炼手册

    一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需 ...

  7. [EF Core]数据迁移(二)

    摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...

  8. SQL Server 2000 绿色精简版gsql适用于xp/win7/win8/win10

    老的程序员肯定都用过sql2000数据库,我在2006-2010年之间,做的不少网站也都是sql2000数据库的,但是后来随着mysql的兴起,就逐渐不再使用sql数据库了.但是最近有个客户的网站要修 ...

  9. .NET对象的创建、垃圾回收、非托管资源的手动处理

    本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没 ...

  10. Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BA ...