今天吃什么,对选择困难症来说,简直是世纪难题!可以从前一天睡前思考到第二天饭点。
于是就有人做出随即暂停的大转盘,让大家“翻牌子”点膳。
有了 AI 以后,这个问题被大家直接抛给了各个大模型。
但万万没想到,鸭鸭在 GitHub 上翻到了一个更“邪修”的解题思路:有人做了个【一饭封神】的开源项目,它接入了AI,不仅能根据现有食材和偏好智能生成菜谱,还能玄学占卜!看看你今天运势适合吃啥!
今日运势、心情料理、幸运数字,每个方式都能给你安排一道神奇菜品!
鸭鸭随便点击一试:

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

不过完全放手让 AI 做饭,生成的菜品多少有点不受控制,能不能吃都要打个问号。
自己掌握主动权也完全没问题。
大家可以自己选好菜品和菜系,让 AI 大师生一个靠谱的菜谱。
比如鸭鸭试着选了个猪肝+韭菜,AI 大师推荐韭香溜肝尖,食材除了韭菜和猪肝外,连配料都列得明明白白!

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

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

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

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),线程可以从自己的队列中取任务执行。如果线程的任务队列为空,它可以从其他线程的队列中“窃取”任务来执行,达到负载均衡的效果。
适合大量小任务并行执行,特别是递归算法或大任务分解成小任务的场景。
1586

被折叠的 条评论
为什么被折叠?



