CS209A · ASSIGNMENT 2 · CONCURRENCY IN ACTION
QQ 农场 · Terminal + JavaFX GUI
模拟 Java Socket + 多线程 + synchronized 互斥锁。左边终端输入命令,右边 JavaFX 风格窗口实时显示农场状态。
CONCURRENCY RULES
How It Works
四条并发规则保证偷菜系统的线程安全
synchronized 互斥锁
每个受害者(victim)对应一个锁。同一时间只有一个线程能进入临界区执行偷菜操作,其他线程必须等待锁释放。
01
在家保护机制
如果受害者正在查看自己的农场(viewing own farm),所有偷菜请求都会被拒绝。只有受害者不在家时才能被偷。
02
25% 偷菜上限
每次访问会话(visit → leave → revisit)最多只能偷走成熟作物的 25%。离开再回来算新会话。
03
CountDownLatch 并发测试
两个客户端同时偷菜 — 使用 Promise.all 模拟 CountDownLatch,观察 mutex 如何序列化并发访问。
04
STEP-BY-STEP GUIDE
Click each step to run the command
1
java -jar Server.jar启动服务器。模拟
ServerSocket 在 5050 端口监听。NPC(bob, charlie, diana)自动连接。2
login alice以 "alice" 身份登录。初始 40 金币。JavaFX 窗口显示你的农场。
3
plant 0 0在 (0,0) 种菜。花费 5 金币。作物立即成熟为 🌻。
4
plant 1 1在 (1,1) 种菜。现在你有 2 个成熟作物了。
5
visit bob访问 bob 的农场。JavaFX 切换到 bob 的作物。开始新的偷菜会话。
6
steal bob偷 bob 的菜!进入
synchronized(victim) 临界区。获得 +3 金币。7
demo🎬 自动演示一次完整的成功偷菜流程 — visit → steal → 结果分析。
8
concurrent⚡ CountDownLatch!两个线程同时偷菜,观察互斥锁如何序列化访问。
自动执行完整演示
Client.java — localhost:5050
╔══════════════════════════════════════════════════╗
║ CS209A Assignment 2 — QQ Farm Terminal v1.0 ║
║ Java Socket + Multithreading + synchronized ║
╚══════════════════════════════════════════════════╝
输入
help 查看命令列表,或点击上方步骤按钮开始
➜
Farm Grid