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. j.u.c系列(02)---线程池ThreadPoolExecutor---tomcat实现策略

    写在前面 本文是以同tomcat 7.0.57. jdk版本1.7.0_80为例. 线程池在tomcat中的创建实现为: public abstract class AbstractEndpoint& ...

  2. Windows访问Linux的Ext4格式分区

    Ext2Fsd是Windows下一套很实用的Driver,虽然名称是ext2fsd但ext3/ext4都可读取,安装完成后电脑便可直接认得ext格式扇区 虽然官方介绍只能支持到Windows 8,但实 ...

  3. maria-developers 开发者邮件

    https://lists.launchpad.net/maria-developers/

  4. build-your-own-lisp

    https://www.gitbook.com/book/ksco/build-your-own-lisp/details

  5. 看opengl 写代码(4) 画一个圆

    opengl 编程指南 P30 以下代码 是 用 直线 连起来 画一个圆. // circle.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  6. 一个例子来看C#泛型是如何登场的

    有这样一个有关汽车的类. public class Car { public int ID { get; set; } public string Make { get; set; } } 现在,在客 ...

  7. h股和L股

  8. Consul替代Eureka

    原文:https://www.cnblogs.com/ityouknow/p/9340591.html 在上个月我们知道 Eureka 2.X 遇到困难停止开发了,但其实对国内的用户影响甚小,一方面国 ...

  9. android iOS 编码问题害死人!

    android 与后端服务器进行通信时,默认使用的编码格式是asi. 而iOS与后端通信时,获取的数据到iOS端默认被utf-8进行编码.所以,我们常常出现android能够从服务器端获取到数据,但是 ...

  10. 为什么不能用memcached存储Session

    Memcached创建者Dormando很早就写过两篇文章[1][2], 告诫开发人员不要用memcached存储Session.他在第一篇文章中给出的理由大致是说,如果用memcached存储Ses ...