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();
    }
}
相关推荐
小阳拱白菜25 分钟前
java异常学习
java
.30-06Springfield28 分钟前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
FrankYoou1 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*2 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了2 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
凌肖战2 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
天河归来2 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
weixin_478689763 小时前
十大排序算法汇总
java·算法·排序算法
码荼3 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
IT_10243 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle