首页 > 编程语言 >[Java面试]经典手撕

[Java面试]经典手撕

时间:2024-07-09 19:18:55浏览次数:11  
标签:ch Java lock void try 面试 经典 new public

多线程循环打印ABC

方法一:

package org.example;

import java.util.TreeMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class PrintABC {

    ReentrantLock lock = new ReentrantLock();
    Condition a = lock.newCondition();
    Condition b = lock.newCondition();
    Condition c = lock.newCondition();

    char ch = 'A';

    public void printA() {
        lock.lock();
        try {
            while (ch != 'A') {
                try {
                    a.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("A");
            ch = 'B';
            b.signal();
        } finally {
            lock.unlock();
        }

    }

    public void printB() {
        lock.lock();
        try {
            while (ch != 'B') {
                try {
                    b.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

            }
            System.out.println("B");
            ch = 'C';
            c.signal();
        } finally {
            lock.unlock();
        }

    }

    public void printC() {
        lock.lock();
        try {
            while (ch != 'C') {
                try {
                    c.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("C");
            ch = 'A';
            a.signal();
        } finally {
            lock.unlock();
        }

    }


}


public class TestPrintABC {

    public static void main(String[] args) {

        PrintABC printABC = new PrintABC();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    printABC.printA();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    printABC.printB();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    printABC.printC();
                }
            }
        }).start();
    }
}

标签:ch,Java,lock,void,try,面试,经典,new,public
From: https://www.cnblogs.com/DCFV/p/18292598

相关文章

  • [Java基础]HashMap
    HashMapHashMap的数据结构HashMap是:数组+链表/红黑树(JDK1.8增加了红黑树部分)数据底层具体存储的是什么?Node<k,v>这样的存储方式有什么优点呢?数据结构//默认初始容量(数组默认大小):16,2的整数次方staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;//最大......
  • java day1
    简单了解了java,他最大的特点就是,稳定,安全,可以解决高并发的访问,最大的优势.java分es,ee,me.java的强势之处在于javaee,我是从javase开始学的.2.安装JDk,我装的是JDK17,据说当前市场大多数用的都是JDK8,17在未来可能会占据更大市场.17也是长期支持版.安装步骤(1)访问甲骨文......
  • [Java并发]Synchronized
    publicclassAtomicTest01{publicstaticinti=0;publicstaticvoidmain(String[]args){Runnabletask=newRunnable(){@Overridepublicvoidrun(){synchronized(this){tr......
  • Java爬虫翻页
    编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端(如ApacheHttpClient或OkHttp)来发送请求,解析HTML页面(如使用Jsoup库),以及处理分页逻辑(如通过URL参数或页面内的链接进行翻页)。1.使用Jsoup和ApacheHttpClient的Java爬虫示例以下是一个使用Jsoup和ApacheHttpClient的Java爬......
  • Java volatile 深度解析
    简介被volatile修饰的变量有两大特点:当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把线程对应的本地内存设置为无效,需要工作线程重新回到主内存中读取最新共享变量。所以volatile的写的内存语......
  • 【转】-Java反射
    Java反射由浅入深|进阶必备原文链接本博文主要记录我学习Java反射(reflect)的一点心得,在了解反射之前,你应该先了解Java中的Class类,如果你不是很了解,可以先简单了解下。一、Java反射机制参考了许多博文,总结了以下个人观点,若有不妥还望指正:Java反射机制在程序运行时,......
  • 教你了解八大排序(含代码注释示例java)
    目录1.冒泡排序(BubbleSort)2.选择排序(SelectSort)3.插入排序(InsertionSort)4.希尔排序(ShellSort)5.归并排序(MergeSort)6.快速排序(QuickSort)7.堆排序(HeapSort)8.基数排序(RadixSort)1.冒泡排序(BubbleSort)这是最简单的排序算法之一。它......
  • 【狂神说Java】系列学习笔记01——MarkDown语法
    #MarkDown学习本文为B站老师秦疆【狂神说Java】系列,课堂学习笔记,主要联练习的是MarkDown的使用方法,老师的博客链接我没找到,广告1.标题+加粗2级3级4级5级6级最多七级标题Helloworld!Helloworld!Helloworld!Helloworld!引用-沐风6标题一级标题(#+空格)二......
  • Java IO
    JavaI/OBIO详解BIO就是:blockingIO。最容易理解、最容易实现的IO工作方式,应用程序向操作系统请求网络IO操作,这时应用程序会一直等待;另一方面,操作系统收到请求后,也会等待,直到网络上有数据传到监听端口;操作系统在收集数据后,会把数据发送给应用程序;最后应用程序受到数据,并解除......
  • java+selenium+autoIt 实现下载(打印)功能
    java+selenium+autoIt实现下载(打印)功能selenium是一个开源的自动化测试框架,它可以模拟用户对浏览器的操作,进行自动化的测试。但是,它不仅仅只能用来做测试。AutoIt是一个使用类似BASIC脚本语言的免费软件,它设计用于WindowsGUI(图形用户界面)中进行自动化操作。它利用模拟键盘......