java多執行緒【Semaphore】
環境
java: 1.7
簡單使用
最近再看恆生給的demo
,其中Semaphore
因為我沒有使用過,就網上找了個通俗易懂的例子,自己消化下。
Semaphore
中文表示的訊號量,用於對資源訪問控制。
小例子
也是參考網上的:
package semaphore;
import java.util.concurrent.Semaphore;
public class SemaphoreTest extends Thread{
private int num = 0;
private Semaphore sm = null;
public SemaphoreTest (int num, Semaphore sm){
this.num = num;
this.sm = sm;
}
public static void main(String[] args) {
//五個機器,8人工人,一個工人只能操作一臺機器
Semaphore sp = new Semaphore(5); //五個機器 這裡5表示許可資料,即 同時允許5個訪問資源
for(int i=0; i<8; i++){
new SemaphoreTest(i, sp).start();
}
}
@Override
public void run() {
try {
sm.acquire();
System.out.println("工人" + num + "佔用一個機器");
System.out.println("可用許可數量" + sm.availablePermits());
System.out.println("工人" + num + "釋放機器");
sm.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果:
工人0佔用一個機器
工人1佔用一個機器
工人3佔用一個機器
可用許可數量1
工人3釋放機器
工人2佔用一個機器
工人4佔用一個機器
可用許可數量3
可用許可數量1
工人2釋放機器
可用許可數量1
可用許可數量1
工人0釋放機器
工人5佔用一個機器
可用許可數量2
工人5釋放機器
工人4釋放機器
工人1釋放機器
工人6佔用一個機器
可用許可數量3
工人7佔用一個機器
工人6釋放機器
可用許可數量3
工人7釋放機器
主要的方法
方法名 | 描述 |
---|---|
acquire() | 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。 |
release() | 用來釋放許可。注意,在釋放許可之前,必須先獲獲得許可。 |
acquire(int permits) | 獲取permits個許可 |
release(int permits) | 釋放permits個許可 |
tryAcquire() | 嘗試獲取一個許可,若獲取成功,則立即返回true,若獲取失敗,則立即返回false |
tryAcquire(long timeout,TimeUnit unit) | 嘗試獲取一個許可,若在指定的時間內獲取成功,則立即返回true,否則則立即返回false |
tryAcquire(int permits) | 嘗試獲取permits個許可,若獲取成功,則立即返回true,若獲取失敗,則立即返回false |
tryAcquire(int permits, long timeout, TimeUnit unit) | 嘗試獲取permits個許可,若在指定的時間內獲取成功,則立即返回true,否則則立即返回false |
availablePermits | 得到可用的許可數目 |
相關推薦
java多執行緒【Semaphore】
環境 java: 1.7 簡單使用 最近再看恆生給的demo,其中Semaphore因為我沒有使用過,就網上找了個通俗易懂的例子,自己消化下。 Semaphore中文表示的訊號量,用於對資源訪問
【Java多執行緒併發總結】Thread類的常用方法(join、yield等)---執行緒的基礎操作篇
啟動(start) 最基本的操作,呼叫Runnable中的run方法,無返回值。 new Thread(new Test()).start(); 休眠(sleep) 使當前執行緒休眠一段時間,預設為毫秒級,最高可以精確到納秒,呼叫的方法為slee
【Java多執行緒 鎖優化】鎖的三種狀態切換
引言 在多執行緒併發程式設計中Synchronized一直是元老級角色,很多人都會稱呼它為重量級鎖,但是隨著Java SE1.6對Synchronized進行了各種優化之後,有些情況下它並不那麼重了,本文詳細介紹了Java SE1.6中為了減少獲得鎖和
java多執行緒--【Foam番茄】
### 程序 是系統資源分配的單位 ### 執行緒 通常在一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義。執行緒是cpu排程和執行的單位 ``` 注意:很多多執行緒是模擬出來的,真正的多執行緒是指有多個cpu,即多核,如伺服器。如果是模擬出來的多執行緒,即在一個
java多執行緒協作Semaphore
Semaphore的意思是訊號量, 多執行緒中使用此類控制併發量, 常用的方法有acquire() 和 release() Semaphore沒有空參構造, 建立物件時必須傳入一個permits 值, 代表最大併發數; 當permits = 1 時 ,代表單執行緒 下面
java多執行緒十 Semaphore
Semaphore類介紹 A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acq
c#中的webbrowser 多執行緒 【轉載】
我們在做採集軟體的時候 有些網站通過直接分析html文字是很麻煩的事情 在利用WinForm程式設計的情況下 有一種更好的方式當然是分析HtmlDocument 然而,這HtmlDoucment並不能直接建立 它必須由 WebBroswer控制元件Navigate生成一個頁
【Java多執行緒】執行緒狀態、執行緒池狀態
執行緒狀態: 執行緒共包括以下5種狀態。1. 新建狀態(New) 執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable) 也被稱為“可執行狀態”。執行緒物件被建立後,
【Java多執行緒】ReentrantReadWriteLock
概述 ReentrantReadWriteLock是Lock的另一種實現方式,ReentrantLock是一個排他鎖,同一時間只允許一個執行緒訪問,而ReentrantReadWriteLock允許多個讀執行緒同時訪問,但不允許寫執行緒和讀執行緒、寫執行緒和寫執行緒同時訪問。相對於排他鎖,提高了併發性。
【JAVA多執行緒問題之死鎖】
一、死鎖是什麼? 舉個例子:兩個人一起吃飯,每個人都拿了一隻筷子,雙方都在等待對方將筷子讓給自己,結果兩個人都吃不了飯。這種情況和計算機中的死鎖情況很相似。 假設有兩個執行緒,互相等待對方釋放佔有的鎖,但是釋放鎖的條件又不可能形成,這時候死鎖就形成了。 還是買票的問題,有的時候時會發生死
【Dr.Chen的系列問題】Java多執行緒的實現操作
一、什麼是多執行緒? 多執行緒(英語:multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多
【Java多執行緒程式設計核心技術】第一章(多執行緒技能suspend,resume,yield)
1.8 暫停執行緒 在多執行緒中,suspend是暫停執行緒,resume是恢復執行緒的執行. 1.8.1suspend方法和resume方法的使用 public class MyThread extends Thread { private lon
【Java多執行緒程式設計核心技術】第一章(多執行緒技能 執行緒的優先順序)
1.8 執行緒的優先順序 在作業系統中,執行緒可以劃分優先順序,優先順序較高的執行緒得到的cpu的資源較多,也就是cpu優先執行優先順序較高的執行緒物件中的任務. 在Java中,執行緒優先順序分為1~10個等級,如果小於1大於10,則JDK丟擲異常,原始碼如下:
java多執行緒程式設計歷史演變【截止到jdk8】
最近看了咕泡學視訊教程,這裡算是做一個記錄。 一、JDK1.5之前時代 建立執行緒的方式 繼承thread package study.java5; /** * @Auther: zhw * @D
【JAVA多執行緒】如何解決一個生產者與消費者問題
如何解決一個生產者與消費者問題 生產者與消費者問題是多執行緒同步的一個經典問題。生產者和消費者同時使用一塊緩衝區,生產者生產商品放入緩衝區,消費者從緩衝區中取出商品。我們需要保證的是,當緩衝區滿時,生產者不可生產商品
【本人禿頂程式設計師】JAVA多執行緒之執行緒間的通訊方式
←←←←←←←←←←←← 我都禿頂了,還不點關注! 一,介紹 本總結我對於JAVA多執行緒中執行緒之間的通訊方式的理解,主要以程式碼結合文字的方式來討論執行緒間的通訊,故摘抄了書中的一些示例程式碼。 二,執行緒間的通訊方式 ①同步 這裡講的同步是指多個執行緒通過synchro
輸出三角形【 Java 多執行緒 】
題目: 利用多執行緒輸出兩個三角形,要求控制兩個執行緒的發生,判斷第一個執行緒是否結束。 並且在第一個執行緒沒結束時,使用 sleep 方法或者 join 方法。 1、sleep 方法。 public class Main { public static
各視窗共同賣票 【 Java 多執行緒 】
現實中也存在這樣的情況: 模擬一個火車站的售票系統,假如當日從A地發往B地的火車票只有10張,且允許所有視窗賣這10張票,每一個視窗也相當於一個執行緒。 1、Runnable介面實現 public class Main { public static void
各視窗單獨賣票 【 Java 多執行緒 】
多視窗賣票,需求如下: 假設一個影院有三個售票口,分別用於向兒童、成人和老人售票。 影院為每個視窗放有10張電影票,分別是兒童票、成人票和老人票。 三個視窗需要同時賣票, 而現在只有一個售票員,這個售票員就相當於一個CPU,三個視窗就相當於三個執行緒。 1 通過擴充套件T
【新聞】本人新書《Java多執行緒程式設計實戰指南(核心篇)》已出版上市
豆瓣主頁 購買連結 試讀下載 (待補充) 原始碼下載 內容簡介 隨著現代處理器的生產工藝從提升處理器主頻頻率轉向多核化,即在一塊晶片上整合多個處理器核心(Core),多核處理器(Multicore Proc