1.繼承Thread
聲明Thread的子類(lèi)
1
2
3
4
5
|
public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); } } |
運(yùn)行thread子類(lèi)的方法
1
2
|
MyThread myThread = new MyThread(); myTread.start(); |
2.創(chuàng)建Thread的匿名子類(lèi)
1
2
3
4
5
6
|
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); } }; thread.start(); |
3.實(shí)現(xiàn)Runnable接口
聲明
1
2
3
4
5
6
|
public class MyThread implements Runnable { @override public void run() { System.out.println("MyThread is running"); } } |
運(yùn)行
1
2
|
Thread thread = new Thread(new MyRunnable()); thread.start(); |
4.創(chuàng)建實(shí)現(xiàn)Runnable接口的匿名類(lèi)
1
2
3
4
5
6
|
new Thread(new Runnable(){ @override public void run() { System.out.println("Thread is running"); } }).start(); |
5.線(xiàn)程名字
創(chuàng)建時(shí)候可以給線(xiàn)程起名字
1
2
3
4
|
Thread thread = new Thread(new MyRunnable(),"name");?獲得名字 Thread thread = new Thread(new MyRunnable(),"name"); System.out.println(thraed.getName());?獲取運(yùn)行當(dāng)期代碼線(xiàn)程的名字 Thread.currentThread().getName(); |
二、線(xiàn)程安全性
1.定義
線(xiàn)程會(huì)共享進(jìn)程范圍內(nèi)的資源,同時(shí),每個(gè)線(xiàn)程也會(huì)有各自的程序計(jì)數(shù)器,棧,以及局部變量。在多個(gè)線(xiàn)程不完全同步的情況下,多個(gè)線(xiàn)程執(zhí)行的順序是不可預(yù)測(cè)的,那么不同的執(zhí)行順序就可能帶來(lái)極其糟糕的結(jié)果。
如何定義一個(gè)類(lèi)是線(xiàn)程安全的呢?最核心的問(wèn)題在于正確性,在代碼中無(wú)需進(jìn)行額外的同步或者協(xié)同操作的情況下,無(wú)論有多少個(gè)線(xiàn)程使用這個(gè)類(lèi),無(wú)論環(huán)境以何種方式調(diào)度多線(xiàn)程,這個(gè)類(lèi)總能表現(xiàn)出正確的行為,我們就成這個(gè)類(lèi)是線(xiàn)程安全的。
2.線(xiàn)程類(lèi)不安全的實(shí)例
1.首先定義Count類(lèi),有私有成員count=0;
1
2
3
4
5
6
7
8
9
10
11
|
public class Count { private long count = 0; public long getCount() { return count; } public void service() { count++; } } |
2.然后在線(xiàn)程中去調(diào)用這個(gè)類(lèi)的service方法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
final Count count = new Count(); for (int i = 0; i < 20000; i++) { Thread thread3 = new Thread(){ @Override public void run() { count.service(); if (count.getCount() == 20000) { System.out.println("ahha"); } } }; thread3.start(); } |
3.結(jié)果程序卻沒(méi)有輸出,說(shuō)明最后count并沒(méi)有達(dá)到20000,為什么呢?
因?yàn)榇嬖谥韵洛e(cuò)誤執(zhí)行的情況:線(xiàn)程2在線(xiàn)程1沒(méi)有完成count自增的情況下就讀取了count,導(dǎo)致最后count沒(méi)有達(dá)到20000。
4.并發(fā)編程中,這種由于不恰當(dāng)?shù)膱?zhí)行順序而顯示了不正確結(jié)果的情況叫做Race Condition(競(jìng)爭(zhēng)狀態(tài)),這種情況出現(xiàn)的根本原因是count的自增沒(méi)有保持原子性。count自增分三步操作,而不是一步到位。
以上這篇Java線(xiàn)程代碼的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/yanwenxiong/archive/2017/08/16/7376313.html