Java并发面试算法题目

实现一个生产者,消费者

思路:用lock锁。定义一个类成员变量 max_value,min_value代表资源的最大,最小数量。

java 复制代码
package org.app.common;

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

public class Resource {
        private int MAX_VALUE= 3;  
        private  int MIN_VALUE=0;
        private   int number = 0;
        private Lock lock = new ReentrantLock();
        private Condition condition = lock.newCondition();
        public void consume(){
            try {
                lock.lock();
                while(number <= MIN_VALUE){
                    condition.await();
                }
                number--;
                System.out.println("【消费者】:消费了一个产品,【现仓储量为】:" + number);
                condition.signalAll();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
        public void produce(){
            try {
                lock.lock();
                while (number >MAX_VALUE) {
                    condition.await();
                }
                number++;
                System.out.println("【生产者】:生产了一个产品\t【现仓储量为】:" + number);
                condition.signalAll();
            }catch (Exception e){

            }finally {
                lock.unlock();
            }
        }
    public static void main(String[] args) {
        Resource resouce = new Resource();
        new Thread(()->{
            for(int i=0;i<10;i++){
                resouce.produce();
            }
        }).start();//生产者
        //消费者
        new Thread(()->{
            for (int i=1;i<=5;i++){
                resouce.consume();
            }
        },String.valueOf("消费者")).start();
    }
}

线程交替打印问题

2个线程交替打印1-10

问题解决方法比较多。

java 复制代码
private static volatile int num = 1;
private static Object lock = new Object();
    public static void main(String[] args) {
        Thread t1 = new Thread() {
            public void run() {
                while (num < 99) {
                    if (num % 2 == 0) {
                        synchronized (lock) {
                            lock.notify();
                            System.out.println("t1" + "_" + num);
                            num++;
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }
            }
        };
        Thread t2 = new Thread() {
            public void run() {
                while (num < 99) {
                    if (num % 2 == 1) {
                        synchronized (lock) {
                            lock.notify();
                            System.out.println("t2" + "_" + num);
                            num++;
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }
            }
        };
        t1.start();
        t2.start();
java 复制代码
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Main2 {
    private int time;
    private int state;
    private Lock lock = new ReentrantLock();
    public Main2(int time){
        this.time = time;
    }
    public void print(String name,int targetNum){
        for(int i=0;i<time;){
            lock.lock();
            if (state % 3 == targetNum) {
                state++;
                i++;
                System.out.println(name);
            }
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        Main2 main2 = new Main2(2);
        new Thread(()->{
            main2.print("B", 1);
        },"B").start();      new Thread(()->{
            main2.print("C", 2);
        },"C").start();
        new Thread(()->{
            main2.print("A", 0);
        },"A").start();
    }
}
相关推荐
青 春 记 忆4 小时前
LeetCode 283. 移动零|Python 解法详解
python·算法·leetcode
mqiqe4 小时前
AgentScope Java 2.0 技能仓库(Skill Repository)完全实战指南
java·开发语言·elasticsearch
水管在开花.4 小时前
Agent范式与LangGraph-②零基础保姆级教程
人工智能·面试·langchain·agent
Mr数据杨5 小时前
【Codex】用学生支持周报模块跟踪个性化支持进展
android·java·javascript·django·codex·项目开发
JavaPub-rodert5 小时前
Apache Jena 详解:Java 开发者如何真正搭起一套知识图谱与语义服务
java·apache·知识图谱
Hrain-AI5 小时前
企业 AI 治理运营怎么做:分级授权、Token 用量可观测与模型统一纳管
大数据·人工智能·算法
lhldsg5 小时前
线上住宿预约系统开发实战:从需求分析到接口设计
java·大数据·小程序·需求分析
剑指offer.5 小时前
Linux多任务-线程篇
java·jvm·算法
2601_962063975 小时前
Spring Boot拦截器(Interceptor)详解
java·spring boot·后端
这是程序猿5 小时前
深入剖析Java HashMap:底层原理、数据结构与核心机制全解析
java·开发语言·数据结构