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