導航:首頁 > 使用方法 > 多線程中最常用的方法

多線程中最常用的方法

發布時間:2022-05-01 21:57:39

❶ 整理C#多線程常用的幾個對象和方法

Thread 幾個中要的方法
Sleep(int):靜態方法,暫停當前線程指定的毫秒數
Abort():通常使用該方法來終止一個線程 ,Thread.ResetAbort() 可以恢復終止的線程
Suspend():不是終止未完成的線程,它僅僅是掛起線程,還可以恢復(已過期,但還是可以用)
Resume()://恢復被Suspend()方法掛起的線程的執行(已過期可以用)
Join():給創建一個子線程,給它加了這個方法,其它線程就會暫停執行,直到這個線程執行完為止才去執行(包括主線程),
下面的例子如果不加join()方法,兩個線程和主線程是並行執行的。如加上Join()方法,就會等到執行完,再執行下面的代碼
Thread threadA = new Thread(SleepMethod); //執行的必須是無返回值的方法
threadA.Name = "小A";
//threadA.Start(); ////啟動線程

Thread threadB = new Thread(SleepMethod);
threadB.Name = "小B";

threadA.Start(); //啟動線程

//Join通俗的說就是創建一個子線程,給它加了這個方法,其它線程就會暫停執行,直到這個線程執行完為止才去執行(包括主線程)
threadA.Join();
threadB.Start();
threadB.Join();

for (int i = 0; i < 10; i++)
{
Console.WriteLine("我是:主線程,我循環{1}次", Thread.CurrentThread.Name, i);
Thread.Sleep(300); //休眠300毫秒
}
Console.ReadKey();
Abort() 和 ResetAbort() 方法
Abort()方法是終止線程,ResetAbort()取消為當前線程請求的Thread.Abort()。
個人理解類似於Suspend()掛起線程和Resume()恢復被掛起的資源。但是 Suspend()仍會鎖定被持有的鎖定,其他線程不能訪問被鎖定的資源,當試圖使用鎖定的資源時,就會造成死鎖。所以Suspend()既然過期了,就盡量不要使用它。
Thread thread = new Thread(ResetAbortMethod);//必須執行無返回值的方法
thread.Name = "子線程";
thread.Start();//是線程被安排執行
StringBuilder threadInfo = new StringBuilder();
threadInfo.AppendFormat(" 線程當前的執行狀態:{0}", thread.IsAlive);
threadInfo.AppendFormat("\n 線程的當前的名字:{0}", thread.Name);
threadInfo.AppendFormat("\n 線程的當前等級:{0}", thread.Priority);
threadInfo.AppendFormat("\n 線程當前的狀態:{0}", thread.ThreadState);

Console.WriteLine(threadInfo);
Console.ReadKey();
上面的線程調用的是下面的方法
public static void ResetAbortMethod()
{
try
{
Console.WriteLine("我是:{0},我要終止了", Thread.CurrentThread.Name);

//終止線程,後面的代碼不會執行。(線程終止會引發異常ThreadAbortException,Thread.ResetAbort() )
Thread.CurrentThread.Abort();
}
catch (ThreadAbortException ex)
{
Console.WriteLine("我是:{0},我又啟動了", Thread.CurrentThread.Name);

//取消為當前線程請求的 System.Threading.Thread.Abort(System.Object) ,取消後,後面的代碼可以執行
Thread.ResetAbort();
}

for (int i = 0; i < 10; i++)
{
Console.WriteLine("我是:{0},我循環了{1}次", Thread.CurrentThread.Name,i);
}
}
線程安全:當一個線程訪問該類的某個數據時,進行數據保護,其他線程不能進行訪問知道該線程讀取完畢, 其他線程才可使用。不然會出現數據的不一致性。
線程是非同步執行的,為此,我需要執行同步線程。就是多個線程一個一個(one by one)的執行。
Lock就可以了實現了。
摘抄內容:
lock(this) 鎖定 當前實例對象,如果有多個類實例的話,lock鎖定的只是當前類實例,對其它類實例無影響。所有不推薦使用。
lock(typeof(Model))鎖定的是model類的所有實例。
lock(obj)鎖定的對象是全局的私有化靜態變數。外部無法對該變數進行訪問。
lock 確保當一個線程位於代碼的臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
所以,lock的結果好不好,還是關鍵看鎖的誰,如果外邊能對這個誰進行修改,lock就失去了作用。所以一般情況下,使用私有的、靜態的並且是只讀的對象。
1、lock的是必須是引用類型的對象,string類型除外。
2、lock推薦的做法是使用靜態的、只讀的、私有的對象。
3、保證lock的對象在外部無法修改才有意義,如果lock的對象在外部改變了,對其他線程就會暢通無阻,失去了lock的意義。
Monitor類和Mutex類 也能實現線程同步。沒有去用,沒具體去看。

什麼是多線程操作

多線程的概念?
說起多線程,那麼就不得不說什麼是線程,而說起線程,又不得不說什麼是進程。
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
進程可以簡單的理解為一個可以獨立運行的程序單位。它是線程的集合,進程就是有一個或多個線程構成的,每一個線程都是進程中的一條執行路徑。
那麼多線程就很容易理解:多線程就是指一個進程中同時有多個執行路徑(線程)正在執行。
為什麼要使用多線程?
1.在一個程序中,有很多的操作是非常耗時的,如資料庫讀寫操作,IO操作等,如果使用單線程,那麼程序就必須等待這些操作執行完成之後才能執行其他操作。使用多線程,可以在將耗時任務放在後台繼續執行的同時,同時執行其他操作。
2.可以提高程序的效率。
3.在一些等待的任務上,如用戶輸入,文件讀取等,多線程就非常有用了。
缺點:
1.使用太多線程,是很耗系統資源,因為線程需要開辟內存。更多線程需要更多內存。
2.影響系統性能,因為操作系統需要在線程之間來回切換。
3.需要考慮線程操作對程序的影響,如線程掛起,中止等操作對程序的影響。
4.線程使用不當會發生很多問題。
總結:多線程是非同步的,但這不代表多線程真的是幾個線程是在同時進行,實際上是系統不斷地在各個線程之間來回的切換(因為系統切換的速度非常的快,所以給我們在同時運行的錯覺)。
2.多線程與高並發的聯系。
高並發:高並發指的是一種系統運行過程中遇到的一種「短時間內遇到大量操作請求」的情況,主要發生在web系統集中大量訪問或者socket埠集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,資料庫的操作等。如果高並發處理不好,不僅僅降低了用戶的體驗度(請求響應時間過長),同時可能導致系統宕機,嚴重的甚至導致OOM異常,系統停止工作等。如果要想系統能夠適應高並發狀態,則需要從各個方面進行系統優化,包括,硬體、網路、系統架構、開發語言的選取、數據結構的運用、演算法優化、資料庫優化……。
而多線程只是在同/非同步角度上解決高並發問題的其中的一個方法手段,是在同一時刻利用計算機閑置資源的一種方式。
多線程在高並發問題中的作用就是充分利用計算機資源,使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閑置。
3.線程的創建,停止,常用方法介紹。
1.線程的創建:
線程創建主要有2種方式,一種是繼承Thread類,重寫run方法即可;(Thread類實現了Runable介面)
另一種則是實現Runable介面,也需要重寫run方法。
線程的啟動,調用start()方法即可。 我們也可以直接使用線程對象的run方法,不過直接使用,run方法就只是一個普通的方法了。

其他的還有: 通過匿名內部類的方法創建;實現Callable介面。。。。。

2.線程常用方法:
currentThread()方法:該方法返回當前線程的信息 .getName()可以返回線程名稱。

isAlive()方法:該方法判斷當前線程是否處於活動狀態。
sleep()方法:該方法是讓「當前正在執行的線程「休眠指定的時間,正在執行的線程是指this.currentThread()返回的線程。
getId()方法:該方法是獲取線程的唯一標識。
3.線程的停止:
在java中,停止線程並不簡單,不想for。。break那樣說停就停,需要一定的技巧。

線程的停止有3種方法:
1.線程正常終止,即run()方法運行結束正常停止。
2.使用interrupt方法中斷線程。
3.使用stop方法暴力停止線程。
interrupt方法中斷線程介紹:
interrupt方法其實並不是直接中斷線程,只是給線程添加一個中斷標志。
判斷線程是否是停止狀態:
this.interrupted(); 判斷當前線程是否已經中斷。(判斷的是這個方法所在的代碼對應的線程,而不是調用對象對應的線程)

this.isInterrupted(); 判斷線程是否已經中斷。(誰調用,判斷誰)

註:.interrupted()與isInterrupted()的區別:
interrupted()方法判斷的是所在代碼對應的線程是否中斷,而後者判斷的是調用對象對應的線程是否停止
前者執行後有清除狀態的功能(如連續調用兩次時,第一次返回true,則第二次會返回false)
後者沒有清除狀態的功能(兩次返回都為true)
真正停止線程的方法:
異常法:
在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則 throw new interruptedException()然後捕獲該異常即可停止線程。

return停止線程:
在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則return停止線程。 (建議使用異常法停止線程,因為還可以在catch中使線程向上拋,讓線程停止的事件得以傳播)。

暴力法:
使用stop()方法強行停止線程(強烈不建議使用,會造成很多不可預估的後果,已經被標記為過時)
(使用stop方法會拋出 java.lang.ThreadDeath 異常,並且stop方法會釋放鎖,很容易造成數據不一致)
註:在休眠中停止線程:
在sleep狀態下停止線程 會報異常,並且會清除線程狀態值為false;
先停止後sleep,同樣會報異常 sleep interrupted;

4.守護線程。
希望對您有所幫助!~

❸ 在Java 中多線程的實現方法有哪些如何使用

1、 認識Thread和Runnable

Java中實現多線程有兩種途徑:繼承Thread類或者實現Runnable介面。Runnable是介面,建議用介面的方式生成線程,因為介面可以實現多繼承,況且Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,並且new一個實例出來,調用start()方法即可以啟動一個線程。

Thread Test = new Thread();

Test.start();

在使用Runnable的時候需要先new一個實現Runnable的實例,之後啟動Thread即可。

Test impelements Runnable;

Test t = new Test();

Thread test = new Thread(t);

test.start();

總結:Thread和Runnable是實現java多線程的2種方式,runable是介面,thread是類,建議使用runable實現java多線程,不管如何,最終都需要通過thread.start()來使線程處於可運行狀態。

2、 認識Thread的start和run

1) start:

用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到spu時間片,就開始執行run()方法,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

2) run:

run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。

總結:調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。

3、 線程狀態說明

線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,具體可細分為上圖所示7個狀態,說明如下:

1) 線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但不管怎樣,當我們new了thread實例後,線程就進入了初始狀態;

2) 當該對象調用了start()方法,就進入可運行狀態;

3) 進入可運行狀態後,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

4) 進入運行狀態後case就比較多,大致有如下情形:

·run()方法或main()方法結束後,線程就進入終止狀態;

·當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配時間片;

·當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖牢(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記後,就轉入可運行狀態,等待OS分配CPU時間片;

·當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。

·當線程調用stop方法,即可使線程進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的stop。

❹ 多線程有幾種實現方法,都是什麼同步有幾種實現方法,都是什麼

java中多線程的實現方法有兩種:1.直接繼承thread類;2.實現runnable介面;同步的實現方法有五種:1.同步方法;2.同步代碼塊;3.使用特殊域變數(volatile)實現線程同步;4.使用重入鎖實現線程同步;5.使用局部變數實現線程同步

其中多線程實現過程中需注意重寫或者覆蓋run()方法,而對於同步的實現方法中使用較常使用的是利用synchronized編寫同步方法和代碼塊。

❺ JAVA多線程有哪幾種實現方式

JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。

1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:

[java]view plain

❻ java多線程有幾種實現方法

❼ java多線程方法有哪些

java實現線程常用到的方法有三種,供參考:

/**
*方法一:繼承Thread類
*
*@authorqd
*
*/
{

@Override
publicvoidrun(){

System.out.println("run方法裡面編寫業務代碼");
}

publicstaticvoidmain(String[]args){

MyThreadmyThread=newMyThread();
//調用start方法啟動線程
myThread.start();

MyThread1myThread1=newMyThread1();
Threadthread=newThread(myThread1);
//調用start方法啟動線程
thread.start();
}

}

/**
*方法二:實現Runnable介面
*
*@authorqd
*
*/
{

@Override
publicvoidrun(){

System.out.println("run方法裡面編寫業務代碼");
}

}

/**
*方法三:實現Callable<T>介面優點:可以傳參數,有返回值類型
*
*@authorqd
*
*/
<Integer>{

@Override
publicIntegercall()throwsException{
returnnull;
}

}
閱讀全文

與多線程中最常用的方法相關的資料

熱點內容
胸上縫的訓練方法 瀏覽:105
太原公交乘車碼使用方法 瀏覽:944
三星手機撥號快捷鍵怎麼設置在哪裡設置方法 瀏覽:528
如何辨別鑽石好壞的方法 瀏覽:431
hdlc檢測方法 瀏覽:670
水培石斛蘭的種植方法 瀏覽:426
乾式變壓器項目研究試驗方法 瀏覽:386
青春期偏頭疼的原因和解決方法 瀏覽:66
瓷磚成型缺陷解決方法 瀏覽:392
一歲半亞麻籽油的食用方法 瀏覽:28
蟲害處理方法哪裡找 瀏覽:416
決戰平安京有哪些方法登錄 瀏覽:578
小腿劃傷怎麼處理方法 瀏覽:478
如何測量磷酸鹽的方法 瀏覽:976
平穩序列檢測方法 瀏覽:919
不打針治療咳嗽的方法 瀏覽:280
毛利潤30利潤計算方法 瀏覽:4
後束三角肌的鍛煉方法 瀏覽:56
游戲流量包使用方法 瀏覽:934
木工做酒格的計算方法 瀏覽:219