首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 面試題精選:多線程順序打印 ABC、豆瓣圖書爬蟲實戰與 GitHub 開源項目展示

     編輯:Java 綜合教學

Java 面試題精選:多線程順序打印 ABC、豆瓣圖書爬蟲實戰與 GitHub 開源項目展示

收錄兩道高質量面試題,涵蓋並發控制、爬蟲架構設計、代碼規範與開源協作。

題目一:三線程順序打印 ABC (ABCABC...)

要求:三個線程分別打印 A、B、C,最終輸出 ABCABCABC...,代碼需具備擴展性 (N 線程通用)。

方案一:鎖 + 狀態機 + TreeMap 註冊表 (通用 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,啟動並等待
}

優點:邏輯集中、擴展性強;缺點:忙等待、睡眠導致延遲、鎖競爭。

方案二:環形鏈表 + CAS + CountDownLatch (無鎖、高性能)

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。

題目二:豆瓣圖書爬蟲 (外企 500 強面試題)

需求:爬取 book.douban.com 標籤「互聯網、編程、算法」圖書,評分最高前 100 本 (評價數 > 2000),結果導出 Excel,代碼上傳 GitHub。

技術棧:Java + HttpClient/OkHttp + Jsoup/HtmlUnit + 多線程池 + 生產者消費者隊列 + 緩存去重 (BloomFilter/Guava Cache) + 限流 (Token Bucket) + 異常重試 + 代理池。

GitHub 開源:Housum/crawl

面試官評價:架構清晰、併發控制合理、代碼規範、README 完善,但第三方庫依賴較多,建議核心網絡/解析自研。

面試加分項

  • 完整的 README:架構圖、啟動步驟、配置說明、擴展指南。
  • 單元/集成測試覆蓋核心邏輯。
  • Dockerfile + docker-compose 一鍵啟動。
  • CI/CD (GitHub Actions) 自動構建、測試、發布 Release。
  • 代碼質量:Checkstyle、SpotBugs、SonarCloud 掃描徽章。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved