如何保证线程的执行顺序

示例代码

static Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("Thread1");
}
});
static Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("Thread2");
}
});
static Thread t3 = new Thread(new Runnable() {
public void run() {
System.out.println("Thread3");
}
});
1.使用join
public static void main(String[] args) throws InterruptedException {
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
}
join源码:
public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

if (millis < 0) {

throw new IllegalArgumentException("timeout value is negative");
        }

if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
join让主线程等待,至子线程执行结束
2.使用ExecutorService
static ExecutorService es = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws InterruptedException {
es.submit(t1);
es.submit(t2);
es.submit(t3);
es.shutdown();
}
ExecutorService 提供了4种线程池,分别是:
newCachedThreadPool;缓存线程池,可灵活回收、新建
newFixedThreadPool;定长线程池,可控制最大并发数,超出在队列中等待
newScheduledThreadPool;定长线程池,可定时、周期执行
newSingleThreadExecutor;单一线程池,按顺序执行(FIFO,LIFO,优先级)

原文地址:https://www.cnblogs.com/csong7876/p/9090346.html

时间: 2024-09-30 08:50:23

如何保证线程的执行顺序的相关文章

关于CountDownLatch控制线程的执行顺序

在上一篇文章中说过使用thread.join()方法.newSingleThreadExecutor单线程池来控制线程执行顺序.在文章的末尾我提出了一种构想,可否使用经典的生产者和消费者模型来控制执行顺序.在本文中,我将使用CountDownLatch来解决这个问题. 上图是countDownLatch的原理示意图.官方文档给出的解释是:CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.上图中线程A调用方法await()之后,进行阻塞,然后线

线程的执行顺序

线程的执行完全是自发的去抢CPU时间片,谁先抢到谁就先去执行package com.pers.xiancheng; public class Test implements Runnable { int count;//默认是0 static Object obj = new Object(); @Override public void run() { //synchronized块锁定的是整个对象 synchronized (obj) {//synchronized 是用来获得对象锁,只有获

面试官:如何保证定时任务的执行顺序呢?

01. 抛砖 敲黑板,讲重点.今天我先抛一开放性话题,也是我平时面试候选人时经常谈及的,看看你有没有相关解决思路? Q:有A.B两个定时任务,其中任务 B 要在任务 A 执行完成后才能执行,如何保证任务的执行顺序? A:潜意识:啥.啥.啥,一脸懵?心情只能用下图来形容. 从事金融相关研发的程序员,多多少少都了解,一个完整的系统,会像钟表一样,背后隐藏了诸多的齿轮任务在运转.其中系统中的每个定时任务之间,难免会有前置依赖关系. 举个业务场景:对接银行的某理财产品,如果想统计收益,那么最常用的方式便

如何控制线程的执行顺序

错误示例: 1 public class Test { 2 public static void main(String[] args){ 3 thread1.start(); 4 thread2.start(); 5 thread3.start(); 6 } 7 8 static Thread thread1 = new Thread(new Runnable() { 9 @Override 10 public void run() { 11 System.out.println("threa

关于for 循环里 线程执行顺序问题

最近在做项目时遇到了 这样的需求 要在一个for循环里执行下载的操作, 而且要等 下载完每个 再去接着走循环.上网查了一些 觉得说的不是很明确.现在把我用到的代码 贴上 希望可以帮到有此需求的开发者        private Handler mHandler = new Handler() {               public void handleMessage(android.os.Message msg) {                       switch (msg.

Java 线程同步执行(顺序执行)

关于线程,有两种实现方法, 一种是通过继承Runnable接口,另外一种通过扩展Thread类,两者的具体差别,可参考我找的这篇文章 http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html .本主主要是讲 线程的同步执行问题.. 如果程序是通过扩展Thread类的,网上的资料说可以通过 join()函数实现,但本人亲测,此法无法通过.程序如下: public class test1 extends Thread { pu

Jmeter -- 循环控制器和线程并发(关注执行顺序)

测试计划中包含两个线程组,分别设置如下: 线程组1:线程数为2,循环次数为4 线程组2:线程数为4 执行顺序 监听器View Results in Table(用表格查看结果)中,ThreadName列,n-m,其中n指线程组号,m指线程号例如:1-1,指第一个线程组中的第一个线程    1-2,指第一个线程组中的第二个线程    2-1,指第二个线程组中的第一个线程    2-4,指第二个线程组中的第四个线程每个线程下的请求,按顺序执行,有循环的在循环内按顺序执行 两个线程组都有四个请求,请求

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口 一.一个多线程问题,有三类线程,分别是A.B.C,如如实现ABCABCABCABCABC,顺次执行. 方案1.代码如下 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Thr

Java多线程系列四——控制线程执行顺序

假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatch类:指定计数器,当计数器清零即取消阻塞 import java.util.concurrent.CountDownLatch; import org.junit.Assert; import org.junit.Test; /** * @Description: 规定线程次序的方法 */ publ