同步模式之顺序控制线程执行

2023-10-29 22:59

本文主要是介绍同步模式之顺序控制线程执行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

推荐:体系化学习Java(Java面试专题)

文章目录

  • 一、同步模式之顺序控制线程执行
  • 二、代码样例
  • 三、三个线程分别输出a、b、c,按顺序输出abcabcabc (大厂机试题)

一、同步模式之顺序控制线程执行

同步模式是指在多线程编程中,为了保证线程之间的协作和正确性,需要对线程的执行顺序进行控制。顺序控制线程执行是一种同步模式,它通过控制线程的等待和唤醒来实现线程的有序执行。

顺序控制线程执行的实现方式很多,其中比较常用的有以下几种:

  1. join()方法:join()方法可以让一个线程等待另一个线程执行完毕后再执行。使用join()方法可以保证线程的有序执行。

  2. wait()和notify()方法:wait()方法可以让一个线程等待另一个线程的通知,而notify()方法可以通知等待的线程继续执行。使用wait()和notify()方法可以实现线程的等待和唤醒,从而实现线程的有序执行。

  3. synchronized关键字:synchronized关键字可以让一个线程独占一个对象,从而实现线程的同步执行。在多个线程访问共享资源时,使用synchronized关键字可以保证线程的有序执行。
    顺序控制线程执行的实现方式不同,适用于不同的场景。在实际开发中,需要根据具体的需求选择合适的实现方式。

二、代码样例

以下是一个简单的 Java 样例代码,用于演示同步模式之顺序控制线程执行的实现方式:

package com.pany.camp.thread.sync;public class SyncExample {public static void main(String[] args) {final Object lock = new Object();Thread t1 = new Thread(() -> {synchronized (lock) {System.out.println("线程1开始执行");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程1继续执行");}});Thread t2 = new Thread(() -> {synchronized (lock) {System.out.println("线程2开始执行");lock.notify();System.out.println("线程2通知线程1继续执行");}});t1.start();t2.start();}
}

在这里插入图片描述

三、三个线程分别输出a、b、c,按顺序输出abcabcabc (大厂机试题)

package com.pany.camp.thread.sync;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class SyncAbc {private static Lock lock = new ReentrantLock();private static Condition conditionA = lock.newCondition();private static Condition conditionB = lock.newCondition();private static Condition conditionC = lock.newCondition();private static volatile int count = 0;public static void main(String[] args) {Thread threadB = new Thread(new PrintTask("b", 1, conditionB, conditionC));Thread threadC = new Thread(new PrintTask("c", 2, conditionC, conditionA));Thread threadA = new Thread(new PrintTask("a", 0, conditionA, conditionB));threadA.start();threadB.start();threadC.start();}static class PrintTask implements Runnable {private String content;private int order;private Condition current;private Condition next;public PrintTask(String content, int order, Condition current, Condition next) {this.content = content;this.order = order;this.current = current;this.next = next;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {lock.lock();try {while (count % 3 != order) {current.await();}System.out.print(content);count++;next.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}}
}

在这里插入图片描述
我们使用了 Lock 和 Condition 来实现线程的同步,其中 Lock 用于保证线程的互斥访问,Condition 用于实现线程的等待和唤醒。count 变量用于记录当前应该输出哪个字符,order 变量用于记录当前线程应该输出哪个字符。在每个线程的 run 方法中,首先获取锁,然后判断当前应该输出哪个字符,如果不是当前线程应该输出的字符,则当前线程进入等待状态。如果是当前线程应该输出的字符,则输出该字符,将 count 加 1,并通知下一个线程继续执行。最后释放锁。

这篇关于同步模式之顺序控制线程执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303959

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚