激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 淺析Java中Runnable和Thread的區(qū)別

淺析Java中Runnable和Thread的區(qū)別

2020-08-10 19:10孫佳敏 Java教程

在java中可有兩種方式實(shí)現(xiàn)多線程,一種是繼承Thread類,一種是實(shí)現(xiàn)Runnable接口;Thread類是在java.lang包中定義的。接下來通過本文給大家淺析Java中Runnable和Thread的區(qū)別,一起看看吧

線程的起動(dòng)并不是簡單的調(diào)用了你的RUN方法,而是由一個(gè)線程調(diào)度器來分別調(diào)用你的所有線程的RUN方法,
我們普通的RUN方法如果沒有執(zhí)行完是不會(huì)返回的,也就是會(huì)一直執(zhí)行下去,這樣RUN方法下面的方法就不可能會(huì)執(zhí)行了,可是線程里的RUN方法卻不一樣,它只有一定的CPU時(shí)間,執(zhí)行過后就給別的線程了,這樣反復(fù)的把CPU的時(shí)間切來切去,因?yàn)榍袚Q的速度很快,所以我們就感覺是很多線程在同時(shí)運(yùn)行一樣.

你簡單的調(diào)用run方法是沒有這樣效果的,所以你必須調(diào)用Thread類的start方法來啟動(dòng)你的線程.所以你啟動(dòng)線程有兩種方法

一是寫一個(gè)類繼承自Thread類,然后重寫里面的run方法,用start方法啟動(dòng)線程

二是寫一個(gè)類實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)里面的run方法,用new Thread(Runnable target).start()方法來啟動(dòng)

這兩種方法都必須實(shí)現(xiàn)RUN方法,這樣線程起動(dòng)的時(shí)候,線程管理器好去調(diào)用你的RUN方法.

你的TestThread沒有繼承自Thread類,怎么可能會(huì)有start方法呢?

在java中可有兩種方式實(shí)現(xiàn)多線程,一種是繼承Thread類,一種是實(shí)現(xiàn)Runnable接口;Thread類是在java.lang包中定義的。一個(gè)類只要繼承了Thread類同時(shí)覆寫了本類中的run()方法就可以實(shí)現(xiàn)多線程操作了,但是一個(gè)類只能繼承一個(gè)父類,這是此方法的局限。

下面看例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.thread.demo;
class MyThread extends Thread{
private String name;
public MyThread(String name) {
super();
this.name = name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println("線程開始:"+this.name+",i="+i);
}
}
}
package org.thread.demo;
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread("線程a");
MyThread mt2=new MyThread("線程b");
mt1.run();
mt2.run();
}
}

  但是,此時(shí)結(jié)果很有規(guī)律,先第一個(gè)對(duì)象執(zhí)行,然后第二個(gè)對(duì)象執(zhí)行,并沒有相互運(yùn)行。在JDK的文檔中可以發(fā)現(xiàn),一旦調(diào)用start()方法,則會(huì)通過JVM找到run()方法。下面啟動(dòng)start()方法啟動(dòng)線程:

?
1
2
3
4
5
6
7
8
9
package org.thread.demo;
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread("線程a");
MyThread mt2=new MyThread("線程b");
mt1.start();
mt2.start();
}
};

這樣程序可以正常完成交互式運(yùn)行。那么為啥非要使用start();方法啟動(dòng)多線程呢?

在JDK的安裝路徑下,src.zip是全部的java源程序,通過此代碼找到Thread中的start()方法的定義,可以發(fā)現(xiàn)此方法中使用了private native void start0();其中native關(guān)鍵字表示可以調(diào)用操作系統(tǒng)的底層函數(shù),那么這樣的技術(shù)成為JNI技術(shù)(java Native Interface).

Runnable接口

在實(shí)際開發(fā)中一個(gè)多線程的操作很少使用Thread類,而是通過Runnable接口完成。

?
1
2
3
public interface Runnable{
public void run();
}

例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
package org.runnable.demo;
class MyThread implements Runnable{
private String name;
public MyThread(String name) {
this.name = name;
}
public void run(){
for(int i=0;i<100;i++){
System.out.println("線程開始:"+this.name+",i="+i);
}
}
};

  但是在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時(shí)觀察Thread類,有一個(gè)構(gòu)造方法:public Thread(Runnable targer)此構(gòu)造方法接受Runnable的子類實(shí)例,也就是說可以通過Thread類來啟動(dòng)Runnable實(shí)現(xiàn)的多線程。(start()可以協(xié)調(diào)系統(tǒng)的資源):

?
1
2
3
4
5
6
7
8
9
10
package org.runnable.demo;
import org.runnable.demo.MyThread;
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread("線程a");
MyThread mt2=new MyThread("線程b");
new Thread(mt1).start();
new Thread(mt2).start();
}
}

兩種實(shí)現(xiàn)方式的區(qū)別和聯(lián)系:

在程序開發(fā)中只要是多線程肯定永遠(yuǎn)以實(shí)現(xiàn)Runnable接口為主,因?yàn)閷?shí)現(xiàn)Runnable接口相比繼承Thread類有如下好處:

  • 避免點(diǎn)繼承的局限,一個(gè)類可以繼承多個(gè)接口。
  • 適合于資源的共享

以賣票程序?yàn)槔ㄟ^Thread類完成:

?
1
2
3
4
5
6
7
8
9
10
11
package org.demo.dff;
class MyThread extends Thread{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("賣票:ticket"+this.ticket--);
}
}
}
};

  下面通過三個(gè)線程對(duì)象,同時(shí)賣票:

?
1
2
3
4
5
6
7
8
9
10
11
package org.demo.dff;
public class ThreadTicket {
public static void main(String[] args) {
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.start();//每個(gè)線程都各賣了10張,共賣了30張票
mt2.start();//但實(shí)際只有10張票,每個(gè)線程都賣自己的票
mt3.start();//沒有達(dá)到資源共享
}
}

如果用Runnable就可以實(shí)現(xiàn)資源共享,下面看例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.demo.runnable;
class MyThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("賣票:ticket"+this.ticket--);
}
}
}
}
package org.demo.runnable;
public class RunnableTicket {
public static void main(String[] args) {
MyThread mt=new MyThread();
new Thread(mt).start();//同一個(gè)mt,但是在Thread中就不可以,如果用同一
new Thread(mt).start();//個(gè)實(shí)例化對(duì)象mt,就會(huì)出現(xiàn)異常
new Thread(mt).start();
}
};

雖然現(xiàn)在程序中有三個(gè)線程,但是一共賣了10張票,也就是說使用Runnable實(shí)現(xiàn)多線程可以達(dá)到資源共享目的。

Runnable接口和Thread之間的聯(lián)系:

?
1
public class Thread extends Object implements Runnable

發(fā)現(xiàn)Thread類也是Runnable接口的子類。

可見, 實(shí)現(xiàn)Runnable接口相對(duì)于繼承Thread類來說,有如下顯著的好處:

(1)適合多個(gè)相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數(shù)據(jù)有效的分離,較好地體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想。

(2)可以避免由于Java的單繼承特性帶來的局限。我們經(jīng)常碰到這樣一種情況,即當(dāng)我們要將已經(jīng)繼承了某一個(gè)類的子類放入多線程中,由于一個(gè)類不能同時(shí)有兩個(gè)父類,所以不能用繼承Thread類的方式,那么,這個(gè)類就只能采用實(shí)現(xiàn)Runnable接口的方式了。

(3)有利于程序的健壯性,代碼能夠被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的。當(dāng)多個(gè)線程的執(zhí)行代碼來自同一個(gè)類的實(shí)例時(shí),即稱它們共享相同的代碼。多個(gè)線程操作相同的數(shù)據(jù),與它們的代碼無關(guān)。當(dāng)共享訪問相同的對(duì)象是,即它們共享相同的數(shù)據(jù)。當(dāng)線程被構(gòu)造時(shí),需要的代碼和數(shù)據(jù)通過一個(gè)對(duì)象作為構(gòu)造函數(shù)實(shí)參傳遞進(jìn)去,這個(gè)對(duì)象就是一個(gè)實(shí)現(xiàn)了Runnable接口的類的實(shí)例。

以上所述是小編給大家介紹的Java中Runnable和Thread的區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

原文鏈接:http://www.cnblogs.com/sjm19910902/p/6396117.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 福利在线小视频 | 国产精品久久久久久久久粉嫩 | 嫩草91在线 | 日日摸夜夜添夜夜添牛牛 | 天天操很很操 | 成人午夜视频在线观看 | 久久视频精品 | 日本不卡视频在线观看 | 一二区电影 | 特逼视频 | 亚洲电影免费观看国语版 | 四季久久免费一区二区三区四区 | 日本在线视频一区二区三区 | 国产激情网 | 全黄毛片| 干色视频| 国产一有一级毛片视频 | 国产成人高清成人av片在线看 | 久草在线最新 | 毛片免费视频网站 | 久久人人av | 高清国产午夜精品久久久久久 | 全黄裸片武则天一级第4季 偿还电影免费看 | 精品国产一区二区三区免费 | 久久久精品精品 | 中国av免费在线观看 | 91美女啪啪| 毛片免费视频网站 | 一级@片 | 请播放一级毛片 | 一区二区三区在线观看国产 | 日韩在线观看视频一区二区三区 | 激情小说激情图片激情电影 | 中文字幕一二三区芒果 | 久久99久久98精品免观看软件 | 极品大长腿啪啪高潮露脸 | 69性欧美高清影院 | 亚洲视频成人 | 日韩色视频在线观看 | 国产成人高清成人av片在线看 | 爱唯侦察 国产合集 亚洲 |