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

Java線程:新特征-信號量

2022-06-13   來源: Java核心技術 

    Java的信號量實際上是一個功能完畢的計數器對控制一定資源的消費與回收有著很重要的意義信號量常常用於多線程的代碼中並能監控有多少數目的線程等待獲取資源並且通過信號量可以得知可用資源的數目等等這裡總是在強調數目二字但不能指出來有哪些在等待哪些資源可用
 
    因此本人認為這個信號量類如果能返回數目還能知道哪些對象在等待哪些資源可使用就非常完美了僅僅拿到這些概括性的數字對精確控制意義不是很大目前還沒想到更好的用法
 
    下面是一個簡單例子
 




import ncurrentExecutorService;
import ncurrentExecutors;
import ncurrentSemaphore;

/**
* Java線程新特征信號量
*
* @author leizhimin ::
*/
public class Test {
        public static void main(String[] args) {
                MyPool myPool = new MyPool();
                //創建線程池
                ExecutorService threadPool = ExecutorsnewFixedThreadPool();
                MyThread t = new MyThread(任務A myPool );
                MyThread t = new MyThread(任務B myPool );
                MyThread t = new MyThread(任務C myPool );
                //在線程池中執行任務
                threadPoolexecute(t);
                threadPoolexecute(t);
                threadPoolexecute(t);
                //關閉池
                threadPoolshutdown();
        }
}

/**
* 一個池
*/
class MyPool {
        private Semaphore sp;     //池相關的信號量

        /**
         * 池的大小這個大小會傳遞給信號量
         *
         * @param size 池的大小
         */
        MyPool(int size) {
                thissp = new Semaphore(size);
        }

        public Semaphore getSp() {
                return sp;
        }

        public void setSp(Semaphore sp) {
                thissp = sp;
        }
}

class MyThread extends Thread {
        private String threadname;            //線程的名稱
        private MyPool pool;                        //自定義池
        private int x;                                    //申請信號量的大小

        MyThread(String threadname MyPool pool int x) {
                thisthreadname = threadname;
                thispool = pool;
                thisx = x;
        }

        public void run() {
                try {
                        //從此信號量獲取給定數目的許可
                        poolgetSp()acquire(x);
                        //todo也許這裡可以做更復雜的業務
                        Systemoutprintln(threadname + 成功獲取了 + x + 個許可!);
                } catch (InterruptedException e) {
                        eprintStackTrace();
                } finally {
                        //釋放給定數目的許可將其返回到信號量
                        poolgetSp()release(x);
                        Systemoutprintln(threadname + 釋放了 + x + 個許可!);
                }
        }
}
 



任務B成功獲取了個許可!
任務B釋放了個許可!
任務A成功獲取了個許可!
任務C成功獲取了個許可!
任務C釋放了個許可!
任務A釋放了個許可!

Process finished with exit code
 
    從結果可以看出信號量僅僅是對池資源進行監控但不保證線程的安全因此在使用時候應該自己控制線程的安全訪問池資源
 

  本文出自 熔 巖 博客請務必保留此出處


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26264.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.