最近自己寫了個小爬蟲,裡面用到了多執行緒技術,忽然發現對此技術竟然有些陌生了,於是乎開始瘋狂的去問度娘,在此記錄下來,以便自己和各位小夥伴們學習。
一、什麼是執行緒
乙個應用程式就相當於乙個程序,程序擁有應用程式的所有資源程序包括執行緒,程序的資源被執行緒共享,但不擁有執行緒。我們可以開啟電腦中的任務管理器,執行的.exe都是乙個程序,裡面的分支是執行緒。
二、多執行緒
多執行緒其實就是程序中一段並行執行的**
1. 建立並啟動執行緒
static void main()
///
/// 測試方法
///
private static void test1()
}結果:2、暫定執行緒諾幹時間
static void main()
_main()");
console.read();
}///
/// 測試方法
///
private static void test1()
_test()");
for (int i = 0; i < 10; i++)
_");}}
結果:3、執行緒合併
thread.join操作會阻塞當前執行緒,等待子執行緒完成後再進行執行。
static void main()
_main()1");
thread.join();
console.writeline($"主線程id_main()2");
console.read();
}///
/// 測試方法
///
private static void test1()
_test()");
for (int i = 0; i < 10; i++)
_");}}
結果:4、執行緒終止
static void main()
_main()1");
thread.sleep(3000);
thread.abort();
console.writeline($"主線程id_main()2");
console.read();
}///
/// 測試方法
///
private static void test1()
_test()");
for (int i = 0; i < 10; i++)
_");}}
結果:5、執行緒中的引數傳遞
static void main()
_main()");
//第一種引數傳遞方式
var thread1 = new thread(() => test1("小魔王"));
thread1.start();
//第二種引數傳遞方式(引數只能是乙個,object型別)
var parameterizedthreadstart = new parameterizedthreadstart(test2);
var thread2 = new thread(parameterizedthreadstart);
thread2.start("大魔王");
console.read();
}///
/// 測試方法
///
private static void test1(string name)
_我的名字叫:");
}www.cppcns.com ///
/// 測試方法
///
private static void test2(object name)
_我的名字叫:");
}結果:
還有其他的傳遞方式,在此先不做說明了,這裡只介紹thread提供的這麼幾種。
6、執行緒安全和執行緒鎖lock
執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。執行緒安全情況下,不會出現資料不一致或者資料汙染的問題。 執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料! 若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。
lock 關鍵字通過獲取指定物件的互斥鎖,將語句塊標記為臨界區,執行語句然後釋放該鎖。
lock 確保當乙個執行緒位於**的臨界區時,另乙個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的**,則它將一直等待(即被阻止),直到該物件被釋放。使用lock,會導致整個應用程式序列化,降低程式的併發能力,影響效能。
到底什麼場景下要使用lock保證執行緒安全:該序列就序列,該並行就並行。
加鎖前:
public static int i = 1000000;
static void main()
console.read();
}///
/// 測試方法
///
private static void test1()
_i初始值:");
int count = 0;
for (int j = 0; j < 1000000; j++)
console.writeline($"輔線程id_執行次數:");
console.writeline($"輔線程id_i結束值:");
}結果:
加鎖後:
public static int i = 1000000;
private readonly static object objlock = new object();
static void main()
console.read();
}private static void test1()
_i初始值:");
for (int j = 0; j < 1000000; j++)
}console.writeline($"輔線程id_執行次數:");
console.writeline($"輔線程id_i結束值:");
}結果:
好啦,今天關於執行緒的知識就分箱到這裡啦。
c 基礎知識 多執行緒
執行緒被定義為程式的執行路徑。每個執行緒都定義了乙個獨特的控制流。如果您的應用程式涉及到複雜的和耗時的操作,那麼設定不同的執行緒執行路徑往往是有益的,每個執行緒執行特定的工作。執行緒是輕量級程序。乙個使用執行緒的常見例項是現代作業系統中並行程式設計的實現。使用執行緒節省了 cpu 週期的浪費,同時提...
多執行緒基礎知識
建立乙個序列佇列,該佇列中從方的都是要依次執行的任務,dispatch queue serial 表示序列佇列的標示 dispatch queue t serialqueue dispatch queue create serial dispatch queue serial 建立乙個並行佇列,並行...
多執行緒 基礎知識
1 建立執行緒 extends thread implements runnable 啟動執行緒 threadl類的start 執行緒完成 1 run 方法執行完成 2 丟擲乙個未處理的異常導致執行緒的提前結束 2 執行緒的狀態 新建立 執行緒被建立,但是沒有呼叫start方法 可執行 runnab...