C 深入多執行緒

2022-08-24 08:57:12 字數 3226 閱讀 5443

主線程:

th = thread.currentthread;   //

現在的執行緒為主執行緒

th.name = "

mainthread

"; //

set執行緒名字:主線程本身沒有名字

thread1.text += th.name; //

get執行緒名字

建立執行緒:

//

建立執行緒

threadstart thread_action = new threadstart(threadaction); //

方法/寫法一

thread new_thread = new

thread(thread_action);

new_thread.start();

new thread(threadaction).start(); //

方法二:自動轉換成threadstart

new thread(() => threadaction()); //

方法三:使用lambda表示式

public

static

void

threadaction()

建立帶引數的執行緒:

parameterizedthreadstart parameterizedthreadstart = new

parameterizedthreadstart(testboy);

thread new_thread = new

thread(parameterizedthreadstart);

new_thread.start(

"hello

");  //這樣只能指定乙個引數

new thread(testboy).start("

hello");

new thread(() => testboy("

hello baby

")).start(); //

這start就不要寫引數了,不然會丟擲異常的;這樣寫的好處是可以有多個引數

static

void testboy(object

girl)

暫停執行緒:

thread.sleep(1000);     //

讓當前執行緒sleep,單位ms

等待執行緒(等待與暫停不一樣):

等待:當前執行緒,等待呼叫join的執行緒執行完畢。暫停:暫停呼叫sleep的執行緒。

銷毀執行緒(在定義執行緒引用thread的地方,可以呼叫thread.abort方法):

thread.abort();      //

用thread.resetabort();取消當前執行緒的abort

如果執行緒已經start、abort,再次start,則會丟擲異常system.threading.threadstateexception。

判斷執行緒的狀態:

console.writeline(t.threadstate);       //

判斷的是執行緒的生命週期的狀態;t.isalive是執行的狀態

執行緒優先順序:

process.getcurrentprocess().processoraffinity = new intptr(1);      //

把所有的執行緒放在單個cpu上執行(便於測試看到效果)

t.priority = threadpriority.lowest; //

可以get、set優先順序

多個執行緒操作同乙個物件時——加鎖:

static

void

main()

", c.count);

console.writeline(

"-------------------");

console.writeline(

"correct counter

"); //

然後再加鎖進行試驗

counterwithlock c1 = new

counterwithlock();

t1 = new thread(() =>testcounter(c1));

t2 = new thread(() =>testcounter(c1));

t1.start();

t2.start();

t1.join();

t2.join();

console.writeline(

"total count:

", c1.count);

t1.abort();

t2.abort();

//因為如果不加鎖:假設當前物件的count是10,那麼可能執行緒1正在+1,得到11,還沒有儲存;與此同時執行緒2也在+1,也得到11。於是最後儲存的結果就是11;但是按道理應該是12的 —— 錯誤原因

//加了鎖:lock另外乙個物件,於是乙個執行緒訪問該物件時,其他執行緒是無法訪問的,直到該執行緒訪問完畢 —— 因此不會出現上面的情況

}static

void

testcounter(counterbase c)

}

static

void

main()

) console.writeline("

monitor.tryenter allows not to get stuck, returning false after a specified timeout is elapsed");

if(monitor.tryenter(lock1, timespan.fromseconds(5))) //

由於上面始終鎖住lock1不放,故這裡等多久都只能false

else

}//現在直接訪問,肯定就dealock啦

new thread(() =>locktoomuch(lock1, lock2)).start();

lock

(lock2)

console.writeline(

"在前面已經鎖住了,所以後面就不用寫什麼else了");

}}static

void locktoomuch(object lock1, object

lock2)

}

多執行緒 深入洞察 ReentrantLock

工程原始碼來自 jdk 1.8 reentrantlock,可重入鎖,是一種遞迴無阻塞的同步機制。它可以等同於synchronized的使用,但是reentrantlock提供了比synchronized更強大 靈活的鎖機制,可以減少死鎖發生的概率。api介紹如下 乙個可重入的互斥鎖定 lock,它...

五 多執行緒深入話題

1 優雅的停止執行緒 在多執行緒操作之中,啟動多執行緒使用的是thread類中的start 方法,而要對多執行緒進行停止處理,在原來的thread類中提供有stop 方法,但此方法在jdk1.2版本之後就已經過期了,不可使用。而除了stop 方法之外,以下幾個方法也被禁用了 方法方法定義 廢除原因 ...

多執行緒的深入理解

通過單執行緒程式的小例子來深入理解執行緒 程式 執行流程 通過程式執行結果可以看出,主線程建立兩個物件,然後呼叫d1.show 方法,主線程把show方法進棧,執行show方法中的 執行完show方法出棧,此時 d2.show 沒有被執行,緊接著呼叫d2.show 方法。程式執行簡圖 1 多執行緒例...