首页 > 编程语言 >JAVA面试中,面试官最爱问的问题。

JAVA面试中,面试官最爱问的问题。

时间:2024-05-27 17:30:18浏览次数:26  
标签:面试官 JAVA Thread int SharedBuffer sharedBuffer 线程 public 最爱问

 请用wait-notify写一段代码来解决生产者-消费者问题。

生产者-消费者问题是一个经典的并发问题,它描述的是两类并发操作的问题:生产者将数据放入缓冲区,消费者从缓冲区取出数据。使用wait()和notify()方法可以在Java中实现这个问题的解决方案。

以下是一个简单的示例,其中包含一个生产者线程和一个消费者线程,他们共享一个固定大小的缓冲区:

public class ProducerConsumerDemo {

public static void main(String[] args) { SharedBuffer sharedBuffer = new SharedBuffer(10);

Thread producer = new Thread(new Producer(sharedBuffer)); Thread consumer = new Thread(new Consumer(sharedBuffer));

producer.start(); consumer.start(); }

}

class SharedBuffer { private final int maxSize; private final Queue<Integer> buffer = new LinkedList<>();

public SharedBuffer(int maxSize) { this.maxSize = maxSize; }

public synchronized void produce(int item) throws InterruptedException { while (buffer.size() == maxSize) { wait(); } buffer.add(item); notifyAll(); }

public synchronized int consume() throws InterruptedException { while (buffer.isEmpty()) { wait(); } int item = buffer.poll(); notifyAll(); return item; }

}

class Producer implements Runnable { private final SharedBuffer sharedBuffer;

public Producer(SharedBuffer sharedBuffer) { this.sharedBuffer = sharedBuffer; }

@Override public void run() { for (int i = 0; i < 20; i++) { try { sharedBuffer.produce(i); System.out.println("Produced: " + i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

}

class Consumer implements Runnable { private final SharedBuffer sharedBuffer;

public Consumer(SharedBuffer sharedBuffer) { this.sharedBuffer = sharedBuffer; }

@Override public void run() { for (int i = 0; i < 20; i++) { try { int item = sharedBuffer.consume(); System.out.println("Consumed: " + item); Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } }

}

这个示例中,SharedBuffer类提供了produce和consume方法来分别添加和移除缓冲区中的元素。这两个方法都是synchronized的,以确保在同一时间只有一个线程可以访问它们。当缓冲区满时,生产者线程会调用wait()方法进入等待状态,直到消费者线程消费了一些元素并调用notifyAll()方法来唤醒它。同样,当缓冲区为空时,消费者线程会等待,直到生产者线程生产了一些元素。

标签:面试官,JAVA,Thread,int,SharedBuffer,sharedBuffer,线程,public,最爱问
From: https://blog.csdn.net/heye0910032/article/details/139219474

相关文章

  • JAVA面试中,面试官最爱问的问题。
    Java中的final关键字有什么作用?在Java中,final关键字具有多种用途,它可以被应用于类、方法和变量。以下是final关键字的具体作用:修饰变量:当final用于修饰一个变量时,意味着这个变量只能被赋值一次,即它是一个常量。对于基本数据类型,final使变量的值不可变;对于引用类型,final使......
  • java面试,面试官最爱问的问题。
    什么是Java中的多线程?如何实现多线程?Java中的多线程:在Java中,多线程指的是同时执行多个线程以完成不同的任务。线程是程序执行流的最小单元,一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,它们可以并发或并行地执行任务,从而提高程序的执行效率和响应速度。如何实......
  • JAVA面试中,面试官最爱问的问题。
    什么是不可变对象?Java中如何创建一个不可变对象?不可变对象(ImmutableObject)是一种在创建之后其状态就不能被修改的对象。这意味着一旦不可变对象被创建,它的所有字段的值都不能再被改变。不可变对象在多线程环境下是线程安全的,因为它们的状态不会因并发访问而改变。在Java中,要......
  • java list分组并对bigdecimal属性求和
    JavaList分组并对BigDecimal属性求和在Java中,我们经常需要对一个List进行分组,并对其中的BigDecimal属性进行求和操作。这种需求在实际项目中非常常见,比如在处理财务数据、统计数据等场景中。本文将介绍如何使用Java来实现这一功能,同时会提供代码示例来帮助读者更好地理解。1.使......
  • 基于SpringBoot的酒店订房系统-82159(免费领源码+数据库)可做计算机毕业设计JAVA、PHP、
    springboot酒店订房系统摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,酒店订房系统当然也不能排除在外。酒店订房系统是以实际运用为开发背景,运用软件工程开发方法,采用springboot技术构建的一个管理系统......
  • 公司刚入职了一名 Java 中级开发,短短 4 行代码居然凑齐了 3 个 bug!我哭了~~
    作者:l拉不拉米链接:https://juejin.cn/post/7031445206152577061一、前言公司刚入职了一名中级Java开发,经过一个星期的适应学习,各方面表现还不错,于是分配了一个小的迭代给新人做。需求很简单,把从第三方拉取的数据匹配到自身公司后台设置的渠道后,聚合到一个列表中,批量入库。然......
  • 【Java】短 URL 生成器设计:百亿短 URL 怎样做到无冲突?
    一、问题解析在社交媒体上,人们经常需要分享一些URL,但是有些URL可能会很长,比如:https://geek.qq.org/hybrid/pvip?utm_source=geek-pc-discover-banner&utm_term=geek-pc-discover-banner这样长的URL显然体验并不友好。我们期望分享的是一些更短、更易于阅读的短URL,比如像http......
  • 在JavaScript中如何移除数组中的特定项
    在日常开发中,我们经常需要从数组中移除某个特定的元素。在JavaScript中,存在多种不同的方法来完成这一任务,本文将总结几种常见的处理方式,并介绍它们的优缺点。常规情况1.使用.splice()方法按值移除数组元素是否修改原数组:是是否移除重复项:是(使用循环),否(使用i......
  • 代码雨(coderain)源码(html5+css3+javascript,原创)
     大家看过黑客帝国的代码雨吗?本人自己写了一个,效果还可以。演示效果请见https://www.lanbaoshi.site/coderain.htm下面上代码:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="htt......
  • Linux上搭建并使用ffmpeg(Java)
    原网址:https://blog.csdn.net/Just_do_it_HZF/article/details/136404728关于MacOs和Windows系统上使用ffmpeg就不多说了,有很多相关文章,今天给大家分享一个在Linux环境下使用Java语言来使用ffmpeg一、首先去官网下载一个Linux对应的ffmpeg包1、进入ffmpeg官网:官网2、点击左侧导......