真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java中多線程實(shí)現(xiàn)代碼,java中多線程實(shí)現(xiàn)代碼輸出

如何用Java編寫多線程

在java中要想實(shí)現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實(shí)現(xiàn)Runable接口。

創(chuàng)新互聯(lián)建站專注于鐘山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供鐘山營銷型網(wǎng)站建設(shè),鐘山網(wǎng)站制作、鐘山網(wǎng)頁設(shè)計(jì)、鐘山網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造鐘山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鐘山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

對(duì)于直接繼承Thread的類來說,代碼大致框架是:

?

123456789101112 class 類名 extends Thread{ 方法1; 方法2; … public void run(){ // other code… } 屬性1; 屬性2; … }

先看一個(gè)簡單的例子:

?

12345678910111213141516171819202122232425262728 /** * @author Rollen-Holt 繼承Thread類,直接調(diào)用run方法 * */class hello extends Thread { public hello() { } public hello(String name) { this.name = name; } public void run() { for (int i = 0; i 5; i++) { System.out.println(name + "運(yùn)行 " + i); } } public static void main(String[] args) { hello h1=new hello("A"); hello h2=new hello("B"); h1.run(); h2.run(); } private String name; }

【運(yùn)行結(jié)果】:

A運(yùn)行 0

A運(yùn)行 1

A運(yùn)行 2

A運(yùn)行 3

A運(yùn)行 4

B運(yùn)行 0

B運(yùn)行 1

B運(yùn)行 2

B運(yùn)行 3

B運(yùn)行 4

我們會(huì)發(fā)現(xiàn)這些都是順序執(zhí)行的,說明我們的調(diào)用方法不對(duì),應(yīng)該調(diào)用的是start()方法。

當(dāng)我們把上面的主函數(shù)修改為如下所示的時(shí)候:

?

123456 public static void main(String[] args) { hello h1=new hello("A"); hello h2=new hello("B"); h1.start(); h2.start(); }

然后運(yùn)行程序,輸出的可能的結(jié)果如下:

A運(yùn)行 0

B運(yùn)行 0

B運(yùn)行 1

B運(yùn)行 2

B運(yùn)行 3

B運(yùn)行 4

A運(yùn)行 1

A運(yùn)行 2

A運(yùn)行 3

A運(yùn)行 4

因?yàn)樾枰玫紺PU的資源,所以每次的運(yùn)行結(jié)果基本是都不一樣的,呵呵。

注意:雖然我們在這里調(diào)用的是start()方法,但是實(shí)際上調(diào)用的還是run()方法的主體。

那么:為什么我們不能直接調(diào)用run()方法呢?

我的理解是:線程的運(yùn)行需要本地操作系統(tǒng)的支持。

如果你查看start的源代碼的時(shí)候,會(huì)發(fā)現(xiàn):

?

1234567891011121314151617 public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0 || this != me) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); } } private native void start0();

注意我用紅色加粗的那一條語句,說明此處調(diào)用的是start0()。并且這個(gè)這個(gè)方法用了native關(guān)鍵字,次關(guān)鍵字表示調(diào)用本地操作系統(tǒng)的函數(shù)。因?yàn)槎嗑€程的實(shí)現(xiàn)需要本地操作系統(tǒng)的支持。

但是start方法重復(fù)調(diào)用的話,會(huì)出現(xiàn)java.lang.IllegalThreadStateException異常。

通過實(shí)現(xiàn)Runnable接口:

大致框架是:

?

123456789101112 class 類名 implements Runnable{ 方法1; 方法2; … public void run(){ // other code… } 屬性1; 屬性2; … }

來先看一個(gè)小例子吧:

?

123456789101112131415161718192021222324252627282930 /** * @author Rollen-Holt 實(shí)現(xiàn)Runnable接口 * */class hello implements Runnable { public hello() { } public hello(String name) { this.name = name; } public void run() { for (int i = 0; i 5; i++) { System.out.println(name + "運(yùn)行 " + i); } } public static void main(String[] args) { hello h1=new hello("線程A"); Thread demo= new Thread(h1); hello h2=new hello("線程B"); Thread demo1=new Thread(h2); demo.start(); demo1.start(); } private String name; }

【可能的運(yùn)行結(jié)果】:

線程A運(yùn)行 0

線程B運(yùn)行 0

線程B運(yùn)行 1

線程B運(yùn)行 2

線程B運(yùn)行 3

線程B運(yùn)行 4

線程A運(yùn)行 1

線程A運(yùn)行 2

線程A運(yùn)行 3

線程A運(yùn)行 4

關(guān)于選擇繼承Thread還是實(shí)現(xiàn)Runnable接口?

其實(shí)Thread也是實(shí)現(xiàn)Runnable接口的:

?

12345678 class Thread implements Runnable { //… public void run() { if (target != null) { target.run(); } } }

其實(shí)Thread中的run方法調(diào)用的是Runnable接口的run方法。不知道大家發(fā)現(xiàn)沒有,Thread和Runnable都實(shí)現(xiàn)了run方法,這種操作模式其實(shí)就是代理模式。關(guān)于代理模式,我曾經(jīng)寫過一個(gè)小例子呵呵,大家有興趣的話可以看一下:

Thread和Runnable的區(qū)別:

如果一個(gè)類繼承Thread,則不適合資源共享。但是如果實(shí)現(xiàn)了Runable接口的話,則很容易的實(shí)現(xiàn)資源共享。

?

1234567891011121314151617181920212223 /** * @author Rollen-Holt 繼承Thread類,不能資源共享 * */class hello extends Thread { public void run() { for (int i = 0; i 7; i++) { if (count 0) { System.out.println("count= " + count--); } } } public static void main(String[] args) { hello h1 = new hello(); hello h2 = new hello(); hello h3 = new hello(); h1.start(); h2.start(); h3.start(); } private int count = 5; }

【運(yùn)行結(jié)果】:

count= 5

count= 4

count= 3

count= 2

count= 1

count= 5

count= 4

count= 3

count= 2

count= 1

count= 5

count= 4

count= 3

count= 2

count= 1

大家可以想象,如果這個(gè)是一個(gè)買票系統(tǒng)的話,如果count表示的是車票的數(shù)量的話,說明并沒有實(shí)現(xiàn)資源的共享。

我們換為Runnable接口:

?

12345678910111213141516171819 /** * @author Rollen-Holt 繼承Thread類,不能資源共享 * */class hello implements Runnable { public void run() { for (int i = 0; i 7; i++) { if (count 0) { System.out.println("count= " + count--); } } } public static void main(String[] args) { hello he=new hello(); new Thread(he).start(); } private int count = 5; }

【運(yùn)行結(jié)果】:

count= 5

count= 4

count= 3

count= 2

count= 1

總結(jié)一下吧:

實(shí)現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢:

1):適合多個(gè)相同的程序代碼的線程去處理同一個(gè)資源

2):可以避免java中的單繼承的限制

3):增加程序的健壯性,代碼可以被多個(gè)線程共享,代碼和數(shù)據(jù)獨(dú)立。

所以,本人建議大家勁量實(shí)現(xiàn)接口。

?

java 多線程有幾種實(shí)現(xiàn)方法

1、繼承Thread類實(shí)現(xiàn)多線程

繼承Thread類的方法盡管被我列為一種多線程實(shí)現(xiàn)方式,但Thread本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個(gè)實(shí)例,它代表一個(gè)線程的實(shí)例,并且,啟動(dòng)線程的唯一方法就是通過Thread類的start()實(shí)例方法。start()方法是一個(gè)native方法,它將啟動(dòng)一個(gè)新線程,并執(zhí)行run()方法。這種方式實(shí)現(xiàn)多線程很簡單,通過自己的類直接extend Thread,并復(fù)寫run()方法,就可以啟動(dòng)新線程并執(zhí)行自己定義的run()方法。例如:

[java] view plain copy

public class MyThread extends Thread {

public void run() {

System.out.println("MyThread.run()");

}

}

在合適的地方啟動(dòng)線程如下:

[java] view plain copy

MyThread myThread1 = new MyThread();

MyThread myThread2 = new MyThread();

myThread1.start();

myThread2.start();

2、實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線程

如果自己的類已經(jīng)extends另一個(gè)類,就無法直接extends Thread,此時(shí),必須實(shí)現(xiàn)一個(gè)Runnable接口,如下:

[java] view plain copy

public class MyThread extends OtherClass implements Runnable {

public void run() {

System.out.println("MyThread.run()");

}

}

為了啟動(dòng)MyThread,需要首先實(shí)例化一個(gè)Thread,并傳入自己的MyThread實(shí)例:

[java] view plain copy

MyThread myThread = new MyThread();

Thread thread = new Thread(myThread);

thread.start();

事實(shí)上,當(dāng)傳入一個(gè)Runnable target參數(shù)給Thread后,Thread的run()方法就會(huì)調(diào)用target.run(),參考JDK源代碼:

[java] view plain copy

public void run() {

if (target != null) {

target.run();

}

}

3、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程

ExecutorService、Callable、Future這個(gè)對(duì)象實(shí)際上都是屬于Executor框架中的功能類。想要詳細(xì)了解Executor框架的可以訪問 ,這里面對(duì)該框架做了很詳細(xì)的解釋。返回結(jié)果的線程是在JDK1.5中引入的新特征,確實(shí)很實(shí)用,有了這種特征我就不需要再為了得到返回值而大費(fèi)周折了,而且即便實(shí)現(xiàn)了也可能漏洞百出。

可返回值的任務(wù)必須實(shí)現(xiàn)Callable接口,類似的,無返回值的任務(wù)必須Runnable接口。執(zhí)行Callable任務(wù)后,可以獲取一個(gè)Future的對(duì)象,在該對(duì)象上調(diào)用get就可以獲取到Callable任務(wù)返回的Object了,再結(jié)合線程池接口ExecutorService就可以實(shí)現(xiàn)傳說中有返回結(jié)果的多線程了。下面提供了一個(gè)完整的有返回結(jié)果的多線程測試?yán)?,在JDK1.5下驗(yàn)證過沒問題可以直接使用。

java多線程有幾種實(shí)現(xiàn)方法

繼承Thread類來實(shí)現(xiàn)多線程:

當(dāng)我們自定義的類繼承Thread類后,該類就為一個(gè)線程類,該類為一個(gè)獨(dú)立的執(zhí)行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。

run方法中定義的代碼為線程代碼,但run方法不能直接調(diào)用,如果直接調(diào)用并沒有開啟新的線程而是將run方法交給調(diào)用的線程執(zhí)行

要開啟新的線程需要調(diào)用Thread類的start()方法,該方法自動(dòng)開啟一個(gè)新的線程并自動(dòng)執(zhí)行run方法中的內(nèi)容

? ? ?

請(qǐng)點(diǎn)擊輸入圖片描述

結(jié)果: ? ? ? ? ? ?

? ? ?

請(qǐng)點(diǎn)擊輸入圖片描述

*java多線程的啟動(dòng)順序不一定是線程執(zhí)行的順序,各個(gè)線程之間是搶占CPU資源執(zhí)行的,所有有可能出現(xiàn)與啟動(dòng)順序不一致的情況。

CPU的調(diào)用策略:

如何使用CPU資源是由操作系統(tǒng)來決定的,但操作系統(tǒng)只能決定CPU的使用策略不能控制實(shí)際獲得CPU執(zhí)行權(quán)的程序。

線程執(zhí)行有兩種方式:

1.搶占式:

目前PC機(jī)中使用最多的一種方式,線程搶占CPU的執(zhí)行權(quán),當(dāng)一個(gè)線程搶到CPU的資源后并不是一直執(zhí)行到此線程執(zhí)行結(jié)束,而是執(zhí)行一個(gè)時(shí)間片后讓出CPU資源,此時(shí)同其他線程再次搶占CPU資源獲得執(zhí)行權(quán)。

2.輪循式;

每個(gè)線程執(zhí)行固定的時(shí)間片后讓出CPU資源,以此循環(huán)執(zhí)行每個(gè)線程執(zhí)行相同的時(shí)間片后讓出CPU資源交給下一個(gè)線程執(zhí)行。

JAVA程序設(shè)計(jì),多線程,求大神給一份可運(yùn)行的代碼

給你一個(gè)經(jīng)典的例子。run里面放空循環(huán)來觀察多線程是不合理的,空循環(huán)消耗時(shí)序極小,用sleep來間隔時(shí)間才是合理的。

class?RunnableDemo?implements?Runnable?{

private?Thread?t;

private?String?threadName;

RunnableDemo(?String?name)?{

threadName?=?name;

System.out.println("Creating?"?+??threadName?);

}

public?void?run()?{

System.out.println("Running?"?+??threadName?);

try?{

for(int?i?=?4;?i??0;?i--)?{

System.out.println("Thread:?"?+?threadName?+?",?"?+?i);

//?Let?the?thread?sleep?for?a?while.

Thread.sleep(50);

}

}catch?(InterruptedException?e)?{

System.out.println("Thread?"?+??threadName?+?"?interrupted.");

}

System.out.println("Thread?"?+??threadName?+?"?exiting.");

}

public?void?start?()?{

System.out.println("Starting?"?+??threadName?);

if?(t?==?null)?{

t?=?new?Thread?(this,?threadName);

t.start?();

}

}

}

public?class?TestThread?{

public?static?void?main(String?args[])?{

RunnableDemo?R1?=?new?RunnableDemo(?"Thread-1");

R1.start();

RunnableDemo?R2?=?new?RunnableDemo(?"Thread-2");

R2.start();

}???

}

多線程的java 程序如何編寫?

Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。

新建狀態(tài):

使用 new 關(guān)鍵字和 Thread 類或其子類建立一個(gè)線程對(duì)象后,該線程對(duì)象就處于新建狀態(tài)。它保持這個(gè)狀態(tài)直到程序 start() 這個(gè)線程。

就緒狀態(tài):

當(dāng)線程對(duì)象調(diào)用了start()方法之后,該線程就進(jìn)入就緒狀態(tài)。就緒狀態(tài)的線程處于就緒隊(duì)列中,要等待JVM里線程調(diào)度器的調(diào)度。

運(yùn)行狀態(tài):

如果就緒狀態(tài)的線程獲取 CPU 資源,就可以執(zhí)行 run(),此時(shí)線程便處于運(yùn)行狀態(tài)。處于運(yùn)行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。

阻塞狀態(tài):

如果一個(gè)線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)。在睡眠時(shí)間已到或獲得設(shè)備資源后可以重新進(jìn)入就緒狀態(tài)??梢苑譃槿N:

等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行 wait() 方法,使線程進(jìn)入到等待阻塞狀態(tài)。

同步阻塞:線程在獲取 synchronized 同步鎖失敗(因?yàn)橥芥i被其他線程占用)。

其他阻塞:通過調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請(qǐng)求時(shí),線程就會(huì)進(jìn)入到阻塞狀態(tài)。當(dāng)sleep() 狀態(tài)超時(shí),join() 等待線程終止或超時(shí),或者 I/O 處理完畢,線程重新轉(zhuǎn)入就緒狀態(tài)。

死亡狀態(tài):

一個(gè)運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時(shí),該線程就切換到終止?fàn)顟B(tài)。

java如何實(shí)現(xiàn)多線程編程

1、public class MyThread extends Thread{//重寫run()方法public void run(){ //多線程要做的事}public static void main(String args[]){ MyThread m1 = new MyThread(); MyThread m2 = new MyThread(); m1.start(); m2.start();}} 2、public class NThread implements Runable{ //實(shí)現(xiàn)run()方法 public void run(){ //多線程要做的事 } public static void main(String args[]){ NThread nt = new NThread(); new Thread(nt,"nt1_name").start(); new Thread(nt,"nt2_name").start(); }}


分享文章:java中多線程實(shí)現(xiàn)代碼,java中多線程實(shí)現(xiàn)代碼輸出
瀏覽地址:http://weahome.cn/article/phhoso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部