主線程:
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 = newparameterizedthreadstart(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優先順序
多個執行緒操作同乙個物件時——加鎖:
staticvoid
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)
}
staticvoid
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 多執行緒例...