收錄兩道高質量面試題,涵蓋並發控制、爬蟲架構設計、代碼規範與開源協作。
要求:三個線程分別打印 A、B、C,最終輸出 ABCABCABC...,代碼需具備擴展性 (N 線程通用)。
public class ABCSample {
static class Node extends Thread {
final int index; final String msg;
final Lock lock; final Map registry;
volatile boolean worked; boolean last;
Node(String msg, Lock lock, Map registry, int index) { ... }
void beforeWork() { last = (index == registry.size() - 1); }
@Override public void run() {
while (true) {
lock.lock();
try {
if (index == 0 && !worked) { print(); worked = true; }
else if (index > 0) {
Node prev = registry.get(index - 1);
if (!prev.worked) { prev.print(); prev.worked = true; }
else if (!worked) { print(); worked = true; }
else if (worked && last) { resetAll(); }
}
} finally { lock.unlock(); }
sleep(1000);
}
}
}
// 主程序註冊 3 個 Node,啟動並等待
}
優點:邏輯集中、擴展性強;缺點:忙等待、睡眠導致延遲、鎖競爭。
public class ABCSample2 {
static class WorkQueue {
Node head, tail; int count;
// Unsafe CAS 操作 head/tail
void push(Node n) { ... } // 無鎖入隊
}
static class Node extends Thread {
static volatile Node current; // 當前輪到誰
static CountDownLatch latch; // 等待所有線程就緒
Node next; String msg;
@Override public void run() {
latch.await();
while (true) {
if (current == this) {
System.out.print(msg);
current = (this == tail) ? head : next;
}
}
}
}
}
優點:無鎖輪詢、延遲極低、結構清晰;缺點:CPU 忙等待,生產環境建議加 LockSupport.parkNanos 或使用 Phaser/Semaphore。
需求:爬取 book.douban.com 標籤「互聯網、編程、算法」圖書,評分最高前 100 本 (評價數 > 2000),結果導出 Excel,代碼上傳 GitHub。
技術棧:Java + HttpClient/OkHttp + Jsoup/HtmlUnit + 多線程池 + 生產者消費者隊列 + 緩存去重 (BloomFilter/Guava Cache) + 限流 (Token Bucket) + 異常重試 + 代理池。
GitHub 開源:Housum/crawl
面試官評價:架構清晰、併發控制合理、代碼規範、README 完善,但第三方庫依賴較多,建議核心網絡/解析自研。