不知道吃什么?GitHub 又出邪修!

今天吃什么,对选择困难症来说,简直是世纪难题!可以从前一天睡前思考到第二天饭点。

于是就有人做出随即暂停的大转盘,让大家“翻牌子”点膳。

image-20251202152330568

有了 AI 以后,这个问题被大家直接抛给了各个大模型。

但万万没想到,鸭鸭在 GitHub 上翻到了一个更“邪修”的解题思路:有人做了个【一饭封神】的开源项目,它接入了AI,不仅能根据现有食材和偏好智能生成菜谱,还能玄学占卜!看看你今天运势适合吃啥!

今日运势、心情料理、幸运数字,每个方式都能给你安排一道神奇菜品!

鸭鸭随便点击一试:

image-20251202151849537

这道菜也太邪门了吧!

img

如果觉得占卜太刺激,喜欢开盲盒的同学有福了,【一饭封神】提供了美食盲盒,它会先给你食材,你确认了,它才给你菜谱!

image-20251202153950389

不过完全放手让 AI 做饭,生成的菜品多少有点不受控制,能不能吃都要打个问号。

自己掌握主动权也完全没问题。

大家可以自己选好菜品和菜系,让 AI 大师生一个靠谱的菜谱。

比如鸭鸭试着选了个猪肝+韭菜,AI 大师推荐韭香溜肝尖,食材除了韭菜和猪肝外,连配料都列得明明白白!

image-20251202155006517

对于冰箱塞满了食材,但脑子一片空白的同学来说,直接上满汉全席功能!告诉 AI 你要几道菜、什么口味,它当场给你安排一桌好菜!八大菜系、西餐、日料,随便你挑!

image-20251202165135677

如果你想要稍微追求一下生活品质,【一饭封神】还有营养分析以及饮品搭配功能。贴心,真的是太贴心了!

3267a634-2cac-4218-bb86-d404c9a7affb

好玩又有趣,火了也是理所当然!项目上线至今,已经拿下 2.6k stars。

19fffa8d-6554-4346-b8f1-383a65914041

GitHub 和 在线体验地址都给大家准备好了,感兴趣的同学,可以自己体验一下:

GitHub 地址:https://github.com/liu-ziting/what-to-eat

在线体验地址:https://eat.lz-t.top/today-eat

……

今天给大家分享一篇美团 java 后端面经:

在这里插入图片描述

篇幅有限,完整答案可以进入面试鸭 - 程序员求职面试刷题神器,高频编程题目免费刷进行查阅。

线程状态有哪些?

在 Java 中,线程的生命周期可以细化为以下几个状态:

  • New(初始状态):线程对象创建后,但未调用 start() 方法。
  • Runnable(可运行状态):调用 start() 方法后,线程进入就绪状态,等待 CPU 调度。
  • Blocked(阻塞状态):线程试图获取一个对象锁而被阻塞。
  • Waiting(等待状态):线程进入等待状态,需要被显式唤醒才能继续执行。
  • Timed Waiting(含等待时间的等待状态):线程进入等待状态,但指定了等待时间,超时后会被唤醒。
  • Terminated(终止状态):线程执行完成或因异常退出。

wait 和 sleep 区别

wait()sleep() 都是用于暂停线程的操作,但它们有明显的区别(先说面试官最关心的):

1)使用要求不同

  • wait() 方法必须在同步块或同步方法内调用,否则会抛出 IllegalMonitorStateException。这是因为 wait() 依赖于对象锁来管理线程的等待和唤醒机制。调用后,当前线程会释放它持有的对象锁,并进入等待状态。
  • sleep() 方法可以在任何上下文中调用,不需要获取对象锁。调用后,线程会进入休眠状态,但不会释放它持有的任何锁。

2)方法所属类不同

  • wait():属于 Object 类。
  • sleep():属于 Thread 类。

3)恢复方式不同

  • wait():需要被其他线程通过 notify()notifyAll() 显式唤醒,或被 wait(long timeout) 的超时参数唤醒。
  • sleep():在指定时间后自动恢复运行,或通过抛出 InterruptedException 恢复。

4)用途不同

  • wait():通常用于线程间通信,配合 notify()notifyAll() 来实现线程的协调工作。
  • sleep():用于让线程暂停执行一段时间,通常用于控制线程的执行频率或模拟延时。

线程池有哪些参数?一般如何设置

线程池相关参数解释

  • corePoolSize:核心线程数,即线程池中始终保持的线程数量。
  • maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。
  • keepAliveTime:线程空闲时间,超过这个时间的非核心线程会被销毁。
  • workQueue:任务队列,存放待执行的任务。
  • threadFactory:线程工厂,用于创建新线程。
  • rejectedExecutionHandler:任务拒绝处理器,当任务无法执行时的处理策略。

Java 并发库中提供了 5 种常见的线程池实现,主要通过 Executors 工具类来创建。

1)FixedThreadPool:创建一个固定数量的线程池。

线程池中的线程数是固定的,空闲的线程会被复用。如果所有线程都在忙,则新任务会放入队列中等待。

适合负载稳定的场景,任务数量确定且不需要动态调整线程数。

2)CachedThreadPool:一个可以根据需要创建新线程的线程池。

线程池的线程数量没有上限,空闲线程会在 60 秒后被回收,如果有新任务且没有可用线程,会创建新线程。

适合短期大量并发任务的场景,任务执行时间短且线程数需求变化较大。

3)SingleThreadExecutor:创建一个只有单个线程的线程池。

只有一个线程处理任务,任务会按照提交顺序依次执行。

适用于需要保证任务按顺序执行的场景,或者不需要并发处理任务的情况。

4)ScheduledThreadPool:支持定时任务和周期性任务的线程池。

可以定时或以固定频率执行任务,线程池大小可以由用户指定。

适用于需要周期性任务执行的场景,如定时任务调度器。

5)WorkStealingPool:基于任务窃取算法的线程池。

线程池中的每个线程维护一个双端队列(deque),线程可以从自己的队列中取任务执行。如果线程的任务队列为空,它可以从其他线程的队列中“窃取”任务来执行,达到负载均衡的效果。

适合大量小任务并行执行,特别是递归算法或大任务分解成小任务的场景。

更多

💻 编程学习交流:编程导航
📃 简历快速制作:老鱼简历
✏️ 面试刷题神器:面试鸭
📖 AI 学习指南:AI 知识库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值