题解 | #多线程#

多线程

http://www.nowcoder.com/practice/cd99fbc6154d4074b4da0e74224a1582

参考了前面的兄弟的答案,改了一丢丢

import java.util.Scanner;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            System.out.println(solution2(a));
        }
    }

   private static String solution2(int a) {
        StringBuilder stringBuilder = new StringBuilder(1032);
        //用于阻塞主线程 等4个子线程执行完
        CountDownLatch latch = new CountDownLatch(4);
        //1.作为4条线程共同的锁对象 2.用于控制线程的等待和唤醒
        AtomicInteger count = new AtomicInteger(0);
        for (int i = 0; i < 4; i++) {
            int finalI = i;
            new Thread(() -> {
                for (int j = 0; j < a; j++) {
                    synchronized (count) {
                        while (count.get() % 4 != finalI) {
                            try {
                                count.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        stringBuilder.append((char) ('A' + finalI));
                        count.getAndIncrement();
                        count.notifyAll();
                    }
                }
                latch.countDown();
            }).start();
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
全部评论

相关推荐

11-28 16:00
已编辑
武汉理工大学 Java
想干测开的tomca...:这份简历是“短期项目硬堆中大型系统技术”的“技术炫技式造假模板”,槽点密集到能当反面教材: ### 1. 「项目时长」和「技术密度」严重脱节,造假痕迹焊死在简历上 两个项目时长分别是**3个月、2个月**,但堆了Spring AI、Elasticsearch、MinIO、Kafka、ShardingSphere、Docker、Sentinel等近20个中大型项目才用的技术——正常情况下,光把这些中间件的文档看完+环境搭好,3个月都不够,更别说实现“AI多轮对话、分库分表、RBAC权限、大模型调用”这些功能。 说白了:你这不是“做项目”,是把“后端技术栈清单”往项目里硬塞,明摆着“只调用了API,没碰过核心逻辑”。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务