1. 程式人生 > >AutoResetEvent控制執行緒用法

AutoResetEvent控制執行緒用法

本文主要來自一道面試題,由於之前對AutoResetEvent的使用者很模糊(即使已經使用過了)。面試題題目很簡潔:兩個執行緒交替列印0~100的奇偶數。你可以先動手試試,我主要是嘗試在一個方法裡面完成這個任務。

AutoResetEvent概念

  • AutoResetEvent物件用來進行執行緒同步操作,AutoResetEvent類繼承waitHandle類。waitOne()方法就繼承來自waitHandle類。
  • AutoResetEvent物件有終止和非終止兩種狀態,終止狀態是執行緒繼續執行,非終止狀態使執行緒阻塞,可以呼叫set和reset方法使物件進入終止和非終止狀態。-》可以簡單理解如果AutoResetEvent物件是終止狀態,就像不管別人了,任你撒野去(waitOne()得到的都是撒野訊號)
  • AutoResetEvent顧名思義,其物件在呼叫一次set之後會自動呼叫一次reset,進入非終止狀態使呼叫了等待方法的執行緒進入阻塞狀態。-》可以簡單理解如果AutoResetEvent物件是非終止狀態,就開始管理起別人來了,此時waitOne()得到的訊號都是呆在原地不動訊號。
  • waitHandle物件的waitone可以使當前執行緒進入阻塞狀態,等待一個訊號。直到當前 waitHandle物件收到訊號,才會繼續執行。
  • set可以傳送一個訊號,允許一個呼叫waitone而等待執行緒繼續執行。 ManulResetEvent的set方法可以允許多個。但是要手動關閉,即呼叫reset();
  • reset可以使因為呼叫waitone() 而等待執行緒都進入阻塞狀態。

AutoResetEvent主要方法有

  1. AutoResetEvent(bool initialState):建構函式,用一個指示是否將初始狀態設定為終止的布林值初始化該類的新例項。 false:無訊號,子執行緒的WaitOne方法不會被自動呼叫 true:有訊號,子執行緒的WaitOne方法會被自動呼叫
  2. Reset ():將事件狀態設定為非終止狀態,導致執行緒阻止;如果該操作成功,則返回true;否則,返回false。
  3. Set ():將事件狀態設定為終止狀態,允許一個或多個等待執行緒繼續;如果該操作成功,則返回true;否則,返回false。
  4. WaitOne(): 阻止當前執行緒,直到收到訊號。
  5. WaitOne(TimeSpan, Boolean) :阻止當前執行緒,直到當前例項收到訊號,使用 TimeSpan 度量時間間隔並指定是否在等待之前退出同步域。

有了上面的解釋,開始展示程式碼

 //若要將初始狀態設定為終止,則為 true;若要將初始狀態設定為非終止,則為 false
        static AutoResetEvent oddResetEvent = new AutoResetEvent(false);
        static AutoResetEvent evenResetEvent = new AutoResetEvent(false);
        static int i = 0;
        static void Main(string[] args)
        {
            //ThreadStart是個委託
            Thread thread1 = new Thread(new ThreadStart(show));
            thread1.Name = "偶數執行緒";
            Thread thread2 = new Thread(new ThreadStart(show));
            thread2.Name = "奇數執行緒";
            thread1.Start();
            Thread.Sleep(200);
            thread2.Start();
            Console.Read();

        }
        public static void show()
        {
            if (i == 1) evenResetEvent.WaitOne();
            while (i <= 100)
            {
                int num = i % 2;
                if (num == 0)
                {
                    Console.WriteLine("{0}:{1}  {2}    ", Thread.CurrentThread.Name, i++, num);
                    evenResetEvent.Set();
                    oddResetEvent.WaitOne(); 
                }
               else if (num == 1)
                {  
                    Console.WriteLine("{0}:{1}  {2}    ", Thread.CurrentThread.Name, i++, num);
                    //如果此時AutoResetEvent 為非終止狀態,則執行緒會被阻止,並等待當前控制資源的執行緒通過呼叫 Set 來通知資源可用。否則不會被阻止
                    oddResetEvent.Set();
                    evenResetEvent.WaitOne(); 
                }
            }
        }

結果如下圖所示:

相關推薦

AutoResetEvent控制執行用法

本文主要來自一道面試題,由於之前對AutoResetEvent的使用者很模糊(即使已經使用過了)。面試題題目很簡潔:兩個執行緒交替列印0~100的奇偶數。你可以先動手試試,我主要是嘗試在一個方法裡面完成這個任務。 AutoResetEvent概念 AutoResetEvent物件用來進行執行緒同步操作

AutoResetEvent 與 ManualResetEvent 控制執行暫停及恢復運作 « 關於網路那些事...

C# - AutoResetEvent 與 ManualResetEvent 控制執行緒暫停及恢復運作 C# 有兩個類別可以用來調控執行緒 AutoResetEv

RunLoop六:在實際開發中的應用 之 控制執行生命週期(執行保活) 二

八、 停止 NSRunLoop 執行 上章提到了 ,只有控制器釋放了。執行緒沒有被釋放。這是因為 程式碼 卡在了 [[NSRunLoop currentRunLoop] run];這句程式碼. 任務執行完成後,執行緒會銷燬。但是 有 run 方法的話。代表系統一直在執行run

RunLoop六:在實際開發中的應用 之 控制執行生命週期(執行保活)

一、前言 OC 的程式設計師大多數用過的 AFNetwork 這個網路請求框架。這個框架中就使用了 RunLoop 技術,去控制子執行緒的生命週期。 相當於 它建立了一個子執行緒,這個子執行緒會一直都在記憶體中,不會死亡。當某個時間段需要子執行緒工作時,會告訴子執行緒需要做什麼?過一段時間,

java基礎類庫學習(七.3)控制執行

前言 執行緒的五個狀態新建/就緒/執行/阻塞/死亡 為了很好的控制執行緒的狀態(新建態,就緒態--執行態控制不了),我們來看一下執行緒物件的幾個方法,也就是Thread的幾個方法 控制執行緒的狀態 1使執行緒處於新建態 執行緒子類 a=new 執行緒子類();  

控制執行中斷

控制執行緒中斷 準備工作 實現過程 工作原理 擴充套件學習 更多關注 在上節中,我們學到如何中斷執行緒的執行,以及如何線上程物件中控制中斷。上節中用來展示執行緒可否被中斷的範例原理比較簡單。如果執行緒執行一個分成很多方法的複雜演算法

使用Semaphore控制執行池任務提交的速率

使用Semaphore控制執行緒池任務提交的速率 歡迎關注作者部落格 簡書傳送門 介紹   當執行緒池的工作佇列被填滿後,如果沒有預定義的飽和策略來阻塞任務的執行,則可以通過訊號量Semaphore來限制任務的到達率。Semaphore是一個同步工具類,用

pthread_sigmask 等控制執行的訊號掩碼

示例1: /* 示例一:遮蔽訊號SIGINT 來源:http://www.leoox.com/?p=321 編譯:gcc pthread_sigmask1.c -lpthread 執行後,你發現你按下CTRL+C(觸發SIGIN

32-執行控制——執行特定資料

1. 執行緒特定資料    執行緒特定資料(thread-specific-data),也稱為執行緒私有資料(thread-private-data),是儲存和查詢某個特定執行緒相關資料的一種機制(APUE的說法)。    之所以稱為執行緒私有資料,是因為讓每個

pthread_sigmask 控制執行的訊號掩碼

例項1:遮蔽訊號SIGINT /* 示例一:遮蔽訊號SIGINT 來源:http://www.leoox.com/?p=321 編譯:gcc pthread_sigmask1.c -lpthread 執行後,你發現你按下CTRL+C(觸發SIG

python3 多執行 (threading) + 鎖 (Lock) + 控制執行數量 (Semaphore) 的例項

學習記錄:python3 多執行緒 (threading ) + 鎖 (Lock) + 控制執行緒數量 (Semaphore) 的例項 import threading import time def sub(num): global count

juc控制執行輪詢輸出

大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈 ​    package com.zzh; import java.util.concurrent.locks.Condition; import java.util.concur

實現交替控制執行

1.實現如下結果12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z import

《瘋狂Java講義(第4版)》-----第16章【多執行】(控制執行執行同步)

控制執行緒 join執行緒 等那個執行緒做完後,當前執行緒再做! import java.lang.Thread; public class MyThread extends Thread{ public MyThread(String name){ super(

執行的生命週期以及控制執行

一、執行緒的生命週期 執行緒狀態轉換圖: 1、新建狀態 用new關鍵字和Thread類或其子類建立一個執行緒物件後,該執行緒物件就處於新生狀態。處於新生狀態的執行緒有自己的記憶體空間,通過呼叫start方法進入就緒狀態(runnabl

C#中控制執行池的執行順序

在使用執行緒池時,當用執行緒池執行多個任務時,由於執行的任務時間過長,會導制兩個任務互相執行,如果兩個任務具有一定的操作順序,可能會導制不同的操作結果,這時,就要將執行緒池按順序操作。下面先給一段程式碼,該程式碼是不按順序對執行緒池進行操作的,程式碼如下: using System; using

Java 阻塞執行用法

CountDownLatch 首先先說明CountDownLatch輔助類 CountDownLatch,一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。 主要方法 public CountDownLatch(

控制執行(NSThread)和執行時迴圈(NSRunLoop)的退出

原文地址:http://shaheengandhi.com/controlling-thread-exit/ 這是講iOS的執行緒的文章,下面的內容,自己都慘不忍睹啊,哈哈,練習翻譯一下文章,英語太差啊,儘量止步吧。。。。 ------------------------

執行學習(三)——控制執行

Java裡提供了一些工具方法,通過這些方法可以很好地控制執行緒的執行。1、join執行緒        Thread提供了讓一個執行緒等待另一個執行緒完成的方法——join()方法。當在某個程式執行流中呼叫其他執行緒的join()方法時,呼叫執行緒將被阻塞,直到被join()

Condition 控制執行通訊

  Condition 介面描述了可能會與鎖有關聯的條件變數。這些變數在用法上與使用Object.wait 訪問的隱式監視器類似,但提供了更強大的功能。需要特別指出的是,單個Lock 可能與多個Condition 物件關聯。為了避免相容性問題,Condition