多執行緒隨筆

2022-01-11 15:34:40 字數 3878 閱讀 8335

很久沒有更新blog了,太忙了,都沒時間來整理一下知識點,年底了有點時間了,可以好好整理以前寫的專案**了,順便把常用的業務方法都封裝成通用的方法,以便以後使用到能快速完成。切入主題,封裝了乙個常用的多執行緒使用場景的類庫,提供兩種模式,跟大家分享。

很多時候,我們會遇到這種情況,事件a和事件b毫無關係,是兩個很耗時的相對獨立事件,但是事件c需要用到事件a、b完成之後的結果。如下圖,假設,我們的目的是建造一棟房子,事件a表示去拉磚頭,事件b表示去找工人,事件c表示開始建房,

步驟**片段:

static

void main(string

args)

console.writeline(

"c:那開始建房吧!!!");

console.readkey();

}static

void test1(object

s)

console.writeline(s + "

搬完磚了!");

}static

void test2(object

s)

console.writeline(s + "

找夠人了!");

}

另一種情況,事件b必須等事件a的結果,才能進行下一步任務的進行,c則等待ab都完成之後開始下一步任務,如圖,假設,事件a表示組裝電腦,事件b表示等a組裝好之後進行打包工作,事件c表示裝車去配送,c在ab過程中可以做一些事件,比如去拿車,去加油等等,總之do something。

步驟**片段:

static

void main(string

args)

console.writeline(

"c:全部完畢,開始裝車咯");

console.readkey();

}static

void test1(object

s)

console.writeline(s + "

組裝完成!");

}static

void test2(object

s)

console.writeline(s + "

打包完成!");

}

咋一看是a組裝一台,b打包一台才是,這裡不是只有一台電腦而已嘛?!我認為兩個事件已經在不同的執行緒上,需要相關業務邏輯去控制的,應該是我們去控制,不應該影響執行緒內部,才是符合ooa的開閉原則,當然,開發中比這複雜的業務還很多,不一定能應景。歡迎**~~

public

sealed

class

threadwrr

else

});return ifinish !=lsthread.count;

}return

false

; }}}

//////

等待所有執行緒

/// public

static

void

waitalltask()

}//////

初始化執行緒

/// ///

執行方式

public

static

void

init(runningtype runtype)

//////

新增執行方法

/// ///

///方法名 ///

方法引數

public

static

void addtask(string title, funcdelegatewithpara method, object

parameter)

//////

新增執行方法

/// ///

///方法名 public

static

void addtask(string

title, funcdelegate method)

//////

開始執行

/// public

static

void

start()

}) .start();}}

}}private

static

void

ordertask()

else

while (!ia.iscompleted)

}isrunning = false

; }

private

static

void

concurrenttask()

;thread.start();

}else

; thread.start(funcobj.parameter);

}lsthread.add(thread);}}

#region begininvoke / invoke

public

static

void

invoke(funcdelegate func)

public

static

void invoke(funcdelegatewithpara func, object

para)

public

static

iasyncresult begininvoke(funcdelegate func)

public

static iasyncresult begininvoke(funcdelegatewithpara func, object

para)

public

static

void

invoke(system.windows.forms.control owner, funcdelegate func)

else

}public

static

void invoke(system.windows.forms.control owner, funcdelegatewithpara func, object

para)

else

} #endregion

private

class

methodparameter

public methodparameter(string title, funcdelegatewithpara func, object

para)}}

public

delegate

void funcdelegatewithpara(object

parameter);

public

delegate

void

funcdelegate();

//////

執行方式

/// public

enum

runningtype

view code

多執行緒隨筆 1

cas v,expected,newvalue v 當前值 expected 期望值 newvalue 新值 當v等於e時,將n賦予v,否則進行自旋操作 在進行cas時,有執行緒更改了v,之後又更改回來,讓程式以為沒發生改變 設立版本號,在cas時加上版本號比較,atmic包中存在版本號的類 loc...

多執行緒隨筆 2

與wait 的區別 wait需要讓已經獲取鎖的執行緒釋放鎖並阻塞,而locksupport不需要 wait指定喚醒某個執行緒更麻煩,而locksupport更便捷 notify notify不釋放鎖 不可呼叫在wait之前,而unpark可以呼叫在park之前 讓當前執行緒阻塞 locksuppor...

多執行緒之使用者級執行緒切換隨筆

執行緒 比程序更輕的動態執行序列,同一程序中的多個執行緒可以共享資源 記憶體 故執行緒間的切換相比程序更加快速 方便。執行緒的切換 是指令之間的切換,從一段執行序列 程式 切換到另一段執行序列 程式 而記憶體對映表不變 即pc的切換,執行緒的切換也是程序切換的重要組成部分 程序的切換包括 指令的切換...