熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

一個非常簡單和短小的線程池

2022-06-13   來源: Java高級技術 
    最近寫了一個 HTTP 代理服務器發現訪問網頁時建立的連接很多消耗的線程也非常的多對於系統是一個不小的開銷而且這些線程存在的時間都很短%以上的線程存在的時間都在毫秒的等級相對來說線程的建立的注銷就占了絕大部分的CPU時間

    一個很小的線程池
    代碼如下(一共個類):
    /*
    *一個簡單的線程池 ThreadPool java
    */
    public class ThreadPool {
    //以下是配置信息可以更改
    static int MAX_THREAD = ; //未使用
    static int MIN_THREAD = ;
 
    static int id = ; //線程 ID 號主要用於監視線程的工作情況
 
    static private ThreadPool pool = new ThreadPool();
    static public ThreadPool getThreadPool() {
    return pool;
    }
 
    Stack<WorkThread> stack = new Stack<WorkThread>(MIN_THREAD);
    private ThreadPool() {
    }
 
    synchronized public boolean putWorkThread(WorkThread wt) {
    if(stacksize()<MIN_THREAD){
    stackpush(wt);
    return true;
    } else {
    return false;
    }
    }
 
    synchronized public WorkThread getWorkThread() {
    WorkThread wt = null;
    if(stackisEmpty()) {
    wt = new WorkThread(this);
    new Thread(wt線程ID:+id)start();
    id++;
    } else {
    wt = stackpop();
    }
    return wt;
    }
    }
    
    /*
    *工作線程類 WorkThreadjava
    */
    public class WorkThread implements Runnable {
    Object lock = new Object();
    Runnable runner = null;
    ThreadPool pool = null;
 
    public WorkThread(ThreadPool pool) {
    thispool = pool;
    }
 
    public void start(Runnable r) {
    runner = r;
    synchronized(lock) {
    locknotify();
    }
    }
 
    public void run() {
    while(true) {
    if(runner != null) {
    runnerrun();
    runner = null; //及時回收資源
    }
    if(poolputWorkThread(this)) {
    Systemoutprintln (ThreadcurrentThread()getName()+ 被回收!);
    synchronized(lock) {
    try {
    lockwait();
    } catch (InterruptedException ie) {
    Systemoutprintln (停止線程時出現異常);
    }
    }
    } else {
    Systemoutprintln (ThreadcurrentThread()getName()+ 被丟棄!);
    break;
    }
    }
    }
    }

    使用方法:
    Runnable r = ;
    new Thread(r)start();
    這是你以前的代碼使用線程池只需要將後一句變成
    ThreadPoolgetThreadPool()getWorkThread()start(r);
    就可以了其他的代碼不用任何更改

    這個線程池還有兩個功能沒有實現
    最大線程數的控制
    空閒線程等待一定時間後自動注銷
    但這個線程池也有一個好處可以隨時改變最小線程的數量


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27725.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.