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多线程之间的顺序问题的更多相关文章

  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. LayoutParams继承于Android.View.ViewGroup.LayoutParams(转)

    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置.高.宽等信息.假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉L ...

  2. Jquery DataTable基本使用

    1,首先需要引用下面两个文件 <link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css ...

  3. Jquery中使用定时器setInterval和setTimeout

    直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 函数不在$(function(){....})内,setInterval第一个参数为"showAtuto&qu ...

  4. 如何用visio(word)绘制图片表格

    1.用visio是插入excel表格,但是不能差如公示了,修改的话也是进入了excel修改. 2.在word里修改即可,word表格可以插入公式,然后阿银玉兰或者转给pdf截图就好

  5. 无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"的解决办法

    http://blog.csdn.net/blackfield/article/details/6550499 用T-SQL命令附加数据库时,出现如下异常信息: 无法打开物理文件 XXX.mdf&qu ...

  6. ASP.NET Web API实践系列11,如何设计出优秀的API

    本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...

  7. 使用Application.GetResourceStream方法加载资源时得到的总是null

    我们可以预先把程序中用到的资源,如图片,音乐等放入项目中,打包进XAP文档,需要的时候从中调用.下面就说说具体实现方法. 第一步,把数据存进项目. 1.右键点击项目名称-添加-新建文件夹(英文版请自行 ...

  8. 浅析iOS程序设计模式(基于MVC)

    接触iOS手机开发有一段时间了.总体来说,苹果公司设计的开发环境还是非常人性化的.很容易上手,也方便深入. 在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(ob ...

  9. Scrollbar中滚动条的设置

      insideOverlay 默认值,表示在padding区域内并且覆盖在view上 insideInset 表示在padding区域内并且插入在view后面 outsideOverlay 表示在p ...

  10. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...