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

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

Java 給多線程編程提供了內置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。

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

新建狀態:

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

就緒狀態:

當線程對象調用了start()方法之后,該線程就進入就緒狀態。就緒狀態的線程處于就緒隊列中,要等待JVM里線程調度器的調度。

運行狀態:

如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處于運行狀態。處于運行狀態的線程最為復雜,它可以變為阻塞狀態、就緒狀態和死亡狀態。

阻塞狀態:

如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源后可以重新進入就緒狀態。可以分為三種:

等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。

同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用)。

其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。

死亡狀態:

一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀態。

簡單Java多線程代碼求解

因為你new了兩次

試著在Task類內創建一個對象 然后鎖住這個對象

如何用Java編寫多線程

在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable接口。

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

?

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

先看一個簡單的例子:

?

12345678910111213141516171819202122232425262728 /** * @author Rollen-Holt 繼承Thread類,直接調用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 + "運行 " + i); } } public static void main(String[] args) { hello h1=new hello("A"); hello h2=new hello("B"); h1.run(); h2.run(); } private String name; }

【運行結果】:

A運行 0

A運行 1

A運行 2

A運行 3

A運行 4

B運行 0

B運行 1

B運行 2

B運行 3

B運行 4

我們會發現這些都是順序執行的,說明我們的調用方法不對,應該調用的是start()方法。

當我們把上面的主函數修改為如下所示的時候:

?

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

然后運行程序,輸出的可能的結果如下:

A運行 0

B運行 0

B運行 1

B運行 2

B運行 3

B運行 4

A運行 1

A運行 2

A運行 3

A運行 4

因為需要用到CPU的資源,所以每次的運行結果基本是都不一樣的,呵呵。

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

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

我的理解是:線程的運行需要本地操作系統的支持。

如果你查看start的源代碼的時候,會發現:

?

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();

注意我用紅色加粗的那一條語句,說明此處調用的是start0()。并且這個這個方法用了native關鍵字,次關鍵字表示調用本地操作系統的函數。因為多線程的實現需要本地操作系統的支持。

但是start方法重復調用的話,會出現java.lang.IllegalThreadStateException異常。

通過實現Runnable接口:

大致框架是:

?

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

來先看一個小例子吧:

?

123456789101112131415161718192021222324252627282930 /** * @author Rollen-Holt 實現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 + "運行 " + 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; }

【可能的運行結果】:

線程A運行 0

線程B運行 0

線程B運行 1

線程B運行 2

線程B運行 3

線程B運行 4

線程A運行 1

線程A運行 2

線程A運行 3

線程A運行 4

關于選擇繼承Thread還是實現Runnable接口?

其實Thread也是實現Runnable接口的:

?

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

其實Thread中的run方法調用的是Runnable接口的run方法。不知道大家發現沒有,Thread和Runnable都實現了run方法,這種操作模式其實就是代理模式。關于代理模式,我曾經寫過一個小例子呵呵,大家有興趣的話可以看一下:

Thread和Runnable的區別:

如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable接口的話,則很容易的實現資源共享。

?

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; }

【運行結果】:

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

大家可以想象,如果這個是一個買票系統的話,如果count表示的是車票的數量的話,說明并沒有實現資源的共享。

我們換為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; }

【運行結果】:

count= 5

count= 4

count= 3

count= 2

count= 1

總結一下吧:

實現Runnable接口比繼承Thread類所具有的優勢:

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

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

3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立。

所以,本人建議大家勁量實現接口。

?

java線程的經典代碼

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("多線程測試!\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("正在進行的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("第一個主進程");

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

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

System.out.println("在創建一個進程");

t2.start();

try {

System.out.println("使他進入第一個睡眠狀態");

Thread.sleep(2000);

} catch (InterruptedException e) {

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

}

System.out.println("退出第一個進程");

}

public void run() {

try {

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

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

Thread.sleep(3000);

}

} catch (InterruptedException e) {

// TODO: handle exception

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

}

System.out.println("退出第二個進程");

}

public static void main(String[] args) {

new threadDemo2();

}

}

Java多線程代碼,求注釋,越詳盡越好!有點急,謝謝!

這段代碼的功能是顯示各個時區當前時鐘。

TimerListener是一個接口,有一個timeElapsed方法,目的是根據當前的時間繪制時鐘,并刷新顯示。

Timer繼承Thread類,實現了run方法。run方法中,休眠指定的時間,并調用TimerListener的timeElapsed方法。如上例就是每休眠1S調用一次,所以看到的結果就是每1S繪制的時鐘會更新一次。

ClockCanvas繼承JPanel并實現了TimerListener接口,在構造方法中,根據指定的時區得到calendar實例。并開啟線程Timer。

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

時針顏色為紅色,分針為黃色,秒針為藍色。在時鐘下面繪制了城市,顏色為黑色。

網站題目:java中的多線程代碼,java多線程代碼例子
網站網址:http://m.kartarina.com/article6/hdohig.html

成都網站建設公司_創新互聯,為您提供Google網站設計網站收錄網站營銷網頁設計公司關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司
主站蜘蛛池模板: 丝袜无码一区二区三区| 久久亚洲中文字幕无码| 中文字幕丰满伦子无码| 无码精品一区二区三区免费视频| 99无码精品二区在线视频| 亚洲av成人中文无码专区| 中文无码制服丝袜人妻av| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲熟妇无码一区二区三区| 日韩精品无码久久一区二区三| 亚洲AV综合色区无码二区爱AV| 日韩无码系列综合区| 中文字幕无码乱码人妻系列蜜桃| 亚洲中文久久精品无码| 日韩AV无码一区二区三区不卡| 日韩亚洲AV无码一区二区不卡| 国产羞羞的视频在线观看 国产一级无码视频在线| 久久久久亚洲AV成人无码网站| 免费无码H肉动漫在线观看麻豆| 无码人妻啪啪一区二区| 精品无码AV一区二区三区不卡| 亚洲日韩激情无码一区| 亚洲一级Av无码毛片久久精品| 日本精品人妻无码免费大全| 97久久精品无码一区二区| 久久人妻内射无码一区三区| 日本爆乳j罩杯无码视频| 一本一道中文字幕无码东京热| 无码中文人妻在线一区| 亚洲大尺度无码无码专线一区| 99久久亚洲精品无码毛片| 人妻无码αv中文字幕久久| 日韩国产精品无码一区二区三区| 亚洲爆乳无码专区| 亚洲日产无码中文字幕| 无码无遮挡又大又爽又黄的视频| 人妻少妇伦在线无码专区视频| 蜜桃臀无码内射一区二区三区| 精品三级AV无码一区| 无码中文字幕av免费放| 日韩少妇无码喷潮系列一二三|