[实践总结] 如何设置2个线程执行顺序

正常情况下

public class TaskOne extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());
        processCommand();
        System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
    }

    private void processCommand() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class TaskTwo extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());
        processCommand();
        System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
    }

    private void processCommand() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TaskOne one = new TaskOne();
TaskTwo two = new TaskTwo();
one.start();
two.start();

执行结果

第1次执行第2次执行
Thread-0 → Start Time = Mon May 22 21:02:57 CST 2023Thread-1 → Start Time = Mon May 22 21:02:29 CST 2023
Thread-1 → Start Time = Mon May 22 21:02:57 CST 2023Thread-0 → Start Time = Mon May 22 21:02:29 CST 2023
Thread-0 → End Time = Mon May 22 21:03:01 CST 2023Thread-0 → End Time = Mon May 22 21:02:32 CST 2023
Thread-1 → End Time = Mon May 22 21:03:01 CST 2023Thread-1 → End Time = Mon May 22 21:02:32 CST 2023

总结

如果这样写的话线程one和线程two是交替执行的,但是不一定谁先启动。

如何让线程one在线程two前先执行呢?

线程two要在线程onerun里面创建,以此来保证两个线程的先后顺序

/**
 * 保证two在one后面执行
 */
public class TaskTwoInOne extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());

        TaskTwo taskTwo = new TaskTwo();
        taskTwo.start();
        processCommand();

        System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
    }

    private void processCommand() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TaskTwoInOne one = new TaskTwoInOne();
one.start();

执行结果

第1次执行第2次执行
Thread-0 → Start Time = Mon May 22 21:11:56 CST 2023Thread-0 → Start Time = Mon May 22 21:13:17 CST 2023
Thread-1 → Start Time = Mon May 22 21:11:56 CST 2023Thread-1 → Start Time = Mon May 22 21:13:17 CST 2023
Thread-0 → End Time = Mon May 22 21:11:59 CST 2023Thread-1 → End Time = Mon May 22 21:13:20 CST 2023
Thread-1 → End Time = Mon May 22 21:11:59 CST 2023Thread-0 → End Time = Mon May 22 21:13:20 CST 2023

总结

以上只是保证,线程one比线程two先开始执行,但是后面就开始争抢资源不一定谁先结束。

如何让线程two执行完再执行线程one呢?

使用 join() 方法

public class TaskTwoJoinOne extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());

        TaskTwo two = new TaskTwo();
        two.start();
        try {
            two.join(); // 线程two加入到线程one里,two执行完one才开始执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
    }
}

执行结果

第1次执行结果分析
前置条件two.join();线程two加入到线程one里,two 执行完 one 才开始执行
Thread-0 → Start Time = Mon May 22 21:24:24 CST 2023线程one 开始
Thread-1 → Start Time = Mon May 22 21:24:24 CST 2023线程two join
Thread-1 → End Time = Mon May 22 21:24:27 CST 2023线程two 执行完毕
Thread-0 → End Time = Mon May 22 21:24:27 CST 2023线程one 执行完毕
前置条件two.join(2000);线程two加入到线程one里,线程one就等线程two 2000ms,超过2000ms后线程one就和线程two一起争抢资源了。如果线程two执行完不需要2000ms,则直接执行线程one内容,也不需要等够2000ms

总结

这样就太给线程two特权了,线程two不执行完,线程one就一直等着!!!

线程two执行完再执行线程one,如何给这个特权加个时效呢?

使用 join(1000) 方法

public class TaskTwoJoinOne extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " → " + " Start Time = " + new Date());

        TaskTwo two = new TaskTwo();
        two.start();
        try {
            two.join(1000);// 线程two加入到线程one里,就等线程two2000毫秒,超过就不等了

            // two.join(6000);// 最长需等6000ms,如果线程two执行完不需要6000ms,则可以继续执行线程one的内容
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println(Thread.currentThread().getName() + " → " + " End   Time = " + new Date());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 「posix多线程程序设计」是一本介绍多线程编程的参考书籍,主要针对POSIX线程库进行讲解。该书详细介绍了多线程的基本概念、原理以及使用方法。 首先,该书对多线程编程的概念进行了解释,解释了进程和线程的区别,以及为什么使用多线程编程可以提高程序的并发性和响应性。它还解释了多线程并发访问共享数据时可能出现的问题,如竞态条件和死锁,并提供了如何通过加锁和同步机制保证多线程程序的正确性和可靠性。 接下来,该书详细介绍了POSIX线程库的使用方法。它讲解了如何创建线程,如何传递参数给线程函数,以及如何等待线程的结束。此外,它还介绍了线程的属性和状态管理,如设置线程的调度策略和优先级,以及如何取消和终止线程执行。 此外,该书还介绍了线程间的通信和同步机制。它详细讲解了互斥锁、条件变量、信号量等线程同步的方法,以及它们的使用场景和注意事项。这些内容对于处理复杂的多线程程序非常重要,可以确保多个线程之间的协调和合作。 最后,该书还提供了一些高级的多线程编程技术,如线程池、读写锁、自旋锁等。这些技术可以进一步提高多线程程序的性能和效率。 总之,「posix多线程程序设计」以简洁明了的方式介绍了多线程编程的基本概念、原理和使用方法,并提供了丰富的示例和案例,非常适合有一定编程基础的读者学习和参考。无论是对于Linux系统下的软件开发还是嵌入式系统开发,该书都是一本很好的学习资料。 ### 回答2: POSIX多线程程序设计是一本经典的编程指南,该书通过深入讲解POSIX线程库提供的各种函数和特性,帮助读者掌握多线程编程的基本原理和技巧。本书主要内容包括线程创建和销毁、线程同步与互斥、线程调度、线程间通信等。 首先,该书详细介绍了线程的概念和原理,让读者对多线程编程有一个清晰的认识。然后,通过实例和案例分析,介绍了线程的创建和销毁过程,以及如何设置线程的属性和优先级。 其次,该书重点讲解了线程同步和互斥的技术,包括使用互斥量、条件变量、读写锁等实现线程之间的同步和协作。读者可以了解到如何避免线程冲突、死锁等问题,并学习到如何正确使用同步机制来提高程序的性能和并发度。 此外,该书还介绍了线程调度的相关知识,包括线程的优先级、调度策略和调度器的工作原理,读者可以学习到如何合理设置线程的优先级,以及如何利用调度器来实现多线程程序的高效运行。 最后,该书还介绍了线程间通信的方法,包括使用信号量、消息队列和共享内存等实现线程之间的数据传递和同步。读者可以学习到如何正确使用这些通信机制,以及如何解决多线程并发访问共享资源的问题。 总的来说,POSIX多线程程序设计是一本全面而详细的多线程编程指南,适合有一定编程基础的读者学习。通过学习这本书,读者可以掌握多线程编程的基本原理和技巧,提高程序的并发性和性能,设计出高效稳定的多线程程序。 ### 回答3: 《POSIX多线程程序设计》是一本经典的关于多线程编程的书籍,这本书涵盖了POSIX标准接口中与多线程编程相关的各种知识和技术。这里给出一个简要的300字总结。 该书首先介绍了多线程的概念,并解释了为什么使用多线程可以提高程序的性能和响应性。接着,作者详细介绍了POSIX标准接口中的线程创建、销毁、同步和通信等基本操作,同时也详细解释了这些操作的使用方法和注意事项。 随后,书中介绍了线程的调度和优先级,包括如何设置线程的优先级和如何控制线程的调度顺序。此外,还讨论了线程的并发性和同步机制,包括互斥量、条件变量和信号量等。这些内容帮助读者理解如何实现线程之间的数据共享和协作。 此外,书中还讨论了线程的取消和分离。取消是指在执行过程中终止一个线程执行,而分离则是指将线程执行和资源回收分离开来。这些操作在某些特定的场景下非常有用。 最后,书中通过介绍案例和示例程序,帮助读者进一步理解多线程编程的实际应用。通过实践,读者可以更好地掌握多线程编程的技巧和方法。 总体而言,《POSIX多线程程序设计》是一本系统全面介绍了多线程编程的书籍,适合对多线程有一定基础了解的程序员阅读。通过学习该书,读者可以更好地理解和应用多线程编程技术,提高自己的编程水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值