欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java中的多線程代碼,java多線程代碼例子

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

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

塔什庫(kù)爾干塔吉克ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

新建狀態(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)。可以分為三種:

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

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

其他阻塞:通過(guò)調(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)。

簡(jiǎn)單Java多線程代碼求解

因?yàn)槟鉵ew了兩次

試著在Task類內(nèi)創(chuàng)建一個(gè)對(duì)象 然后鎖住這個(gè)對(duì)象

如何用Java編寫多線程

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

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

?

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

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

?

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í)行的,說(shuō)明我們的調(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é)果基本是都不一樣的,呵呵。

注意:雖然我們?cè)谶@里調(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();

注意我用紅色加粗的那一條語(yǔ)句,說(shuō)明此處調(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異常。

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

大致框架是:

?

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

來(lái)先看一個(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)寫過(guò)一個(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ù)量的話,說(shuō)明并沒有實(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)勢(shì):

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

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

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

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

?

java線程的經(jīng)典代碼

package threadgroup;

class ThreadDemo3 extends Thread {

private String name;

private int delay;

public ThreadDemo3(String sname, int i_delay) {

name = sname;

delay = i_delay;

}

public void run() {

try {

sleep(delay);

} catch (InterruptedException e) {

}

System.out.println("多線程測(cè)試!\n" + name + "\n" + delay);

}

}

public class testMyThread {

public static void main(String[] args) {

ThreadDemo3 th1,th2,th3;

th1 = new ThreadDemo3("線程1", (int) (Math.random() * 900));

th2 = new ThreadDemo3("線程2", (int) (Math.random() * 900));

th3 = new ThreadDemo3("線程3", (int) (Math.random() * 900));

th1.start();

th2.start();

th3.start();

}

}

package threadgroup;

public class threadDemo {

public static void main(String[] args) {

Thread t = Thread.currentThread();

t.setName("你好嗎?");

System.out.println("正在進(jìn)行的Thread是:" + t);

try {

for (int i = 0; i 5; i++) {

System.out.println("我不叫穆繼超" + i);

Thread.sleep(3000);

}

} catch (Exception e) {

// TODO: handle exception

System.out.println("Thread has wrong" + e.getMessage());

}

}

}

package threadgroup;

public class threadDemo2 implements Runnable {

public threadDemo2() {

Thread t1 = Thread.currentThread();

t1.setName("第一個(gè)主進(jìn)程");

System.out.println("正在運(yùn)行" + t1);

Thread t2 = new Thread(this, "");

System.out.println("在創(chuàng)建一個(gè)進(jìn)程");

t2.start();

try {

System.out.println("使他進(jìn)入第一個(gè)睡眠狀態(tài)");

Thread.sleep(2000);

} catch (InterruptedException e) {

System.out.println("Thread has wrong" + e.getMessage());

}

System.out.println("退出第一個(gè)進(jìn)程");

}

public void run() {

try {

for (int i = 0; i 5; i++) {

System.out.println("進(jìn)程" + i);

Thread.sleep(3000);

}

} catch (InterruptedException e) {

// TODO: handle exception

System.out.println("Thread has wrong" + e.getMessage());

}

System.out.println("退出第二個(gè)進(jìn)程");

}

public static void main(String[] args) {

new threadDemo2();

}

}

Java多線程代碼,求注釋,越詳盡越好!有點(diǎn)急,謝謝!

這段代碼的功能是顯示各個(gè)時(shí)區(qū)當(dāng)前時(shí)鐘。

TimerListener是一個(gè)接口,有一個(gè)timeElapsed方法,目的是根據(jù)當(dāng)前的時(shí)間繪制時(shí)鐘,并刷新顯示。

Timer繼承Thread類,實(shí)現(xiàn)了run方法。run方法中,休眠指定的時(shí)間,并調(diào)用TimerListener的timeElapsed方法。如上例就是每休眠1S調(diào)用一次,所以看到的結(jié)果就是每1S繪制的時(shí)鐘會(huì)更新一次。

ClockCanvas繼承JPanel并實(shí)現(xiàn)了TimerListener接口,在構(gòu)造方法中,根據(jù)指定的時(shí)區(qū)得到calendar實(shí)例。并開啟線程Timer。

重寫了paintComponent方法,在該方法中,首先繪制了一個(gè)圓,然后分別繪制時(shí)針、分針和秒針。

時(shí)針顏色為紅色,分針為黃色,秒針為藍(lán)色。在時(shí)鐘下面繪制了城市,顏色為黑色。

網(wǎng)站題目:java中的多線程代碼,java多線程代碼例子
網(wǎng)站網(wǎng)址:http://chinadenli.net/article6/hdohig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄網(wǎng)站營(yíng)銷、網(wǎng)頁(yè)設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司