1. 程式人生 > >C# 多執行緒的自動管理(執行緒池)

C# 多執行緒的自動管理(執行緒池)

using System;
using System.Collections;
using System.Threading;
namespace ThreadExample
{
    /// <summary>
    /// 這是用來儲存資訊的資料結構,將作為引數被傳遞
    /// </summary>
    public class SomeState
    {
        public int Cookie;
        public SomeState(int iCookie)
        {
            Cookie = iCookie;
        }
    }
    public class Alpha
    {
        public Hashtable HashCount;
        public ManualResetEvent eventX;
        public static int iCount = 0;
        public static int iMaxCount = 0;
        public Alpha(int MaxCount)
        {
            HashCount = new Hashtable(MaxCount);
            iMaxCount = MaxCount;
        }
        /// <summary>
        /// 執行緒池裡的執行緒將呼叫 Beta()方法
        /// </summary>
        /// <param name="state"></param> 
        public void Beta(Object state)
        {
            // 輸出當前執行緒的 hash 編碼值和 Cookie 的值 
            Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(), ((SomeState)state).Cookie);
            Console.WriteLine("HashCount.Count=={0}, Thread.CurrentThread.GetHash Code()=={1}", HashCount.Count, 
                Thread.CurrentThread.GetHashCode());
            lock (HashCount)
            {
                // 如果當前的 Hash 表中沒有當前執行緒的 Hash 值,則新增之 
                if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))
                    HashCount.Add(Thread.CurrentThread.GetHashCode(), 0);
                HashCount[Thread.CurrentThread.GetHashCode()] = ((int)HashCount[Thread.CurrentThread.GetHashCode()]) + 1;
            }
            Thread.Sleep(2000);
            // Interlocked.Increment() 操作是一個原子操作,具體請看下面說明 
            Interlocked.Increment(ref iCount);
            if (iCount == iMaxCount)
            {
                Console.WriteLine();
                Console.WriteLine("Setting eventX "); 
                eventX.Set();
            }
        }
    }
    public class SimplePool
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Thread Pool Sample:");
            bool W2K = false;
            // 允許執行緒池中執行最多 10 個執行緒 
            int MaxCount = 10;
            // 新建 ManualResetEvent 物件並且初始化為無訊號狀態 
            ManualResetEvent eventX = new ManualResetEvent(false);
            Console.WriteLine("Queuing {0} items to Thread Pool", MaxCount);
            // 注意初始化 oAlpha 物件的 eventX 屬性 
            Alpha oAlpha = new Alpha(MaxCount);            
            oAlpha.eventX = eventX;
            Console.WriteLine("Queue to Thread Pool 0");
            try
            {
                // 將工作項裝入執行緒池 
                // 這裡要用到 Windows 2000 以上版本才有的 API,所以可能出現 NotSupp ortException 異常 
                ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0));
                W2K = true;
            }
            catch (NotSupportedException)
            {
                Console.WriteLine("These API's may fail when called on a non-Wind ows 2000 system.");
                W2K = false;
            }
            if (W2K) // 如果當前系統支援 ThreadPool 的方法. 
            {
                for (int iItem = 1; iItem < MaxCount; iItem++)
                {
                    // 插入佇列元素 
                    Console.WriteLine("Queue to Thread Pool {0}", iItem);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(iItem));
                }
                Console.WriteLine("Waiting for Thread Pool to drain");
                // 等待事件的完成,即執行緒呼叫 ManualResetEvent.Set() 方法 
                eventX.WaitOne(Timeout.Infinite, true);
                // WaitOne() 方法使呼叫它的執行緒等待直到 eventX.Set() 方法被呼叫 
                Console.WriteLine("Thread Pool has been drained (Event fired)");
                Console.WriteLine();
                Console.WriteLine("Load across threads");
                foreach (object o in oAlpha.HashCount.Keys)
                {
                    Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]);
                }
            }
            Console.ReadLine();
        }
    }
}

相關推薦

C# 執行自動管理(執行)

using System; using System.Collections; using System.Threading; namespace ThreadExample { /// <summary> /// 這是用來儲存資訊的資料結構,將作為引數被傳遞 ///

C#執行學習(四) 執行自動管理(執行)

在多執行緒的程式中,經常會出現兩種情況: 一種情況: 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用ThreadPool(執行緒池)來解決; 另一種情況:執行緒平時都處於休眠狀態,只是週期性地被喚醒 這一般使用Tim

[C#] C#執行學習(四) 執行自動管理(執行)

Thread Pool Sample: Queuing  10  items to Thread Pool Queue to Thread Pool  0 Queue to Thread Pool  1 Queue to Thread Pool  2 Queue to Thread Pool  3 Q

java 執行管理執行任務,根據優先順序執行 任務超時管理 執行同步執行管理

需求 需要根據優先順序執行任務,有任務不是特別重要,可以稍後執行;需要對正在執行的執行緒做超時監控;有的API依賴任務返回結果,執行緒池執行的時候任務也支援同步任務; 簡單測試 建立一個使用支援優先順序佇列(new PriorityBlockingQu

C#線程學習(四) 線程的自動管理(線程)

lock ini hash tar 並且 incr 沒有 amp bool 在多線程的程序中,經常會出現兩種情況: 一種情況: 應用程序中,線程把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用ThreadP

C#執行學習(五) 執行自動管理(定時器)

Timer類:設定一個定時器,定時執行使用者指定的函式。 定時器啟動後,系統將自動建立一個新的執行緒,執行使用者指定的函式。 初始化一個Timer物件: Timer timer = new Timer(timerDelegate, s,1000, 1000); /

C# 執行啟動和管理 單例模式

1.          List<Task> taskList = new List<Task>();             TaskFactory t

block 知識點 ---- Objective-C 高階程式設計 iOS 與 OS X 執行記憶體管理 學習筆記

1. block捕捉變數: 結論:只有呼叫_Block_copy 才能持有截獲的附有 __strong 修飾符的物件型別的自動變數值。 block 中使用物件型別的自動變數時,除以下情形,推薦使用copy方法: “When the Block is returned

C++執行(一)——執行管理

序 多執行緒是……/*此處省略一萬字,省略的文字詳細說明了什麼是多執行緒、其歷史及其發展、使用多執行緒的好處和缺點以及C/C++對多執行緒的支援的歷史*/ C++標準庫自C++11標準以來開始支援多執行緒,多執行緒相關的類在thread標頭檔案中,所以使用請先必須#incl

C++在Windows環境下執行自動鎖的實現

                         許久不更博了,手有點生了………… 博主最近找工作並實習去了,忙碌的生活也算比較充實,      然後就是擠不出時間來更博真是尷尬尷尬啊…………

c/c++ 執行 std::lock

多執行緒 std::lock 當要同時操作2個物件時,就需要同時鎖定這2個物件,而不是先鎖定一個,然後再鎖定另一個。同時鎖定多個物件的方法:std::lock(物件1.鎖,物件2.鎖...) 額外說明:lock_guard<mutex> lock_a(d1.m, std::adopt_lock

C#執行順序依賴執行控制

在開發過程中,經常需要多個任務並行的執行的場景,同時任務之間又需要先後依賴的關係。針對這樣的處理邏輯,通常會採用多執行緒的程式模型來實現。   比如A、B、C三個執行緒,A和B需要同時啟動,並行處理,且B需要依賴A完成,在進行後續的處理,C需要B完成後開始處理。  

C/C++ 執行機制

一、C/C++多執行緒操作說明 C/C++多執行緒基本操作如下: 1. 執行緒的建立結束 2. 執行緒的互斥和同步 3. 使用訊號量控制執行緒 4. 執行緒的基本屬性配置  在C/C++程式碼編寫時,使用多執行緒機制,首先需要做的事情就是宣告引用,具體如下

c/c++ 執行 std::once

多執行緒 std::once 轉自:https://blog.csdn.net/hengyunabc/article/details/33031465 std::once的特點:即使有多個執行緒要訪問同一個函式,只有一個執行緒會成功。 std::once的用途:當某個資料只有在初始化的時候需要執行緒安全

C#執行基礎(執行的優先順序、狀態、同步)

一、關於多執行緒的優先順序、狀態、同步指令碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System

C++執行之std::thread

C++11,包含標頭檔案 thread.h,並使用名稱空間std。 thread類提供的方法 方法 描述 thread 建構函式,在這裡傳入執行緒執行函式,和函式引數

C++ 執行pthread 學習筆記

本篇是我在學習C++多執行緒的時候做的筆記,主要記錄的是基礎的流程,部分程式碼例項,以及重點函式的說明。 pthread 入口函式型別說明 void * func1(void * t) void* 表示無型別指標 void*作為函式引數,表示函式接收一個指標,不管是什麼型別

2017.10.21 C# 執行控制控制元件例項

直接上程式碼片段 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text

2017.10.12 C#執行與非同步的區別

最近在寫個多執行緒處理的程式,又重新溫習了一下相關知識,記錄在這裡。 C#多執行緒與非同步的區別 原文地址:http://kb.cnblogs.com/page/116095/ 多執行緒和非同步操作的異同   多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體

linux c 執行開發

在開發多執行緒程式時,當建立的執行緒數量特別多的時候,就會遇到執行緒數量的瓶頸。 多執行緒設定 設定核心引數 kernel.threads-max kernel.threads-max 是 linux 系統允許建立的最大執行緒數,預設是 7767 修改 /etc/sysc