多線程是用于處理復(fù)雜項(xiàng)目的
成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。成都創(chuàng)新互聯(lián)公司擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開(kāi)源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺(jué)化效果。
打個(gè)比方
你的主程序線程A中有個(gè)循環(huán),由于代碼是一行行走的,所以循環(huán)結(jié)束前下面的代碼無(wú)法運(yùn)行,而此時(shí)主界面的反應(yīng)就類似卡死的樣子,你點(diǎn)擊按鈕也沒(méi)有反應(yīng),因?yàn)橹骶€程在忙著循環(huán)呢,所以對(duì)按鈕的事件代碼要等待了,如果要避免這種情況,就要用到多線程,另開(kāi)一個(gè)新線程專門用來(lái)執(zhí)行循環(huán)代碼,主界面就不會(huì)卡死了,只要在循環(huán)結(jié)束后將結(jié)果傳回主線程調(diào)用就可以了,再?gòu)?fù)雜點(diǎn)要涉及到委托,控制了
按你的要求其實(shí)你的代碼用不到多線程,只要把sleep放到兩段代碼中間就可以了。
新線程結(jié)束用thread.abort()
多線程一般是不推薦用的,因?yàn)榫€程之間如果有共享資源的話會(huì)引起競(jìng)爭(zhēng),需要加鎖處理;而且線程間沒(méi)有時(shí)序關(guān)系,所以你在調(diào)試中可能會(huì)出現(xiàn)異步處理結(jié)束順序與開(kāi)始處理順序不一致的情況(我在調(diào)試中已經(jīng)發(fā)現(xiàn)該問(wèn)題)。
針對(duì)你提出的這個(gè)問(wèn)題,采用了多線程處理,利用的是BackgroundWorker也就是異步處理控件進(jìn)行了處理。
代碼已經(jīng)經(jīng)過(guò)調(diào)試通過(guò)。歡迎交流,如有問(wèn)題,留下QQ或其他聯(lián)系方式。
代碼如下,并附程序截圖。
‘---------------------------------------------------
Imports?System.ComponentModel?'導(dǎo)入異步控件命名空間
Public?Class?Form1
Private?howmany?As?Integer?=?10
Private?AnalysisNumber(0?To?howmany?-?1)?As?BackgroundWorker
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
ListBox1.Items.Clear()
creatNewBackgroundWorker()
addHandle()
startWork()
End?Sub
Private?Sub?creatNewBackgroundWorker()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AnalysisNumber(i)?=?New?BackgroundWorker
Next
End?Sub
Private?Sub?addHandle()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AddHandler?AnalysisNumber(i).DoWork,?AddressOf?AnalysisNumber_DoWork
AddHandler?AnalysisNumber(i).RunWorkerCompleted,?AddressOf?AnalysisNumber_RunWorkerCompleted
Next
End?Sub
Private?Sub?startWork()
For?i?As?Integer?=?0?To?9
Dim?temp(0?To?9)?As?Integer
For?j?As?Integer?=?1?To?10
temp(j?-?1)?=?10?*?i?+?j
Next
AnalysisNumber(i).RunWorkerAsync(temp)
Next
End?Sub
Private?Sub?AnalysisNumber_DoWork(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.DoWorkEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Argument,?Integer())
Dim?temp?As?Integer
For?i?As?Integer?=?0?To?data.Length?-?1
temp?=?data(i)
data(i)?=?temp?*?temp
Next
e.Result?=?data
End?Sub
Private?Sub?AnalysisNumber_RunWorkerCompleted(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.RunWorkerCompletedEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Result,?Integer())
For?i?As?Integer?=?0?To?data.Length?-?1
ListBox1.Items.Add(data(i))
Next
End?Sub
End?Class
首先,你把你那些要運(yùn)行很久的過(guò)程。盡量放在一個(gè)過(guò)程中。
因?yàn)榫€程只能是過(guò)程,不能使函數(shù),沒(méi)有返回值的。
然后,在某個(gè)事件下這樣寫(xiě):
**這里我假設(shè)你的那個(gè)很就的過(guò)程叫做 sub aaa()
調(diào)用如下:
Dim mythread As New System.Threading.Thread(AddressOf aaa)
mythread.Start()
***********
這樣就是定義一個(gè)線程,名字叫 mythread,這個(gè)線程會(huì)運(yùn)行aaa這個(gè)過(guò)程。
start 就是讓線程運(yùn)行。
我告訴你思路,你自己去實(shí)現(xiàn)。
建議你用“守護(hù)線程”的方式去做,這樣做對(duì)于你一個(gè)小任務(wù)來(lái)說(shuō)更合適。首先,你要建立一個(gè)隊(duì)列,將所有下載任務(wù)放入隊(duì)列。注意,這個(gè)隊(duì)列必須是“線程安全”的,即兩個(gè)線程不會(huì)搶到同一個(gè)任務(wù)。然后只開(kāi)10個(gè)線程。這些線程會(huì)從隊(duì)列中讀取任務(wù)。當(dāng)一個(gè)線程不能再?gòu)年?duì)列中讀取任務(wù)時(shí),也就是隊(duì)列為空時(shí),退出。等所有線程都退出后,你的程序就結(jié)束了。
還有一種方法,叫“線程池”,也就是你說(shuō)的方法,稍微復(fù)雜一點(diǎn):
指定一個(gè)變量,用來(lái)表示線程的數(shù)量。剛開(kāi)始為0,每開(kāi)一個(gè)線程+1。當(dāng)一個(gè)線程完成任務(wù)退出后,這個(gè)變量-1。直到所有任務(wù)都完成后,不再產(chǎn)生新線程。