- 論壇徽章:
- 0
|
本章,我們學(xué)習(xí)“常用的實(shí)現(xiàn)多線程的2種方式”:Thread 和 Runnable。
之所以說(shuō)是常用的,是因?yàn)橥ㄟ^(guò)還可以通過(guò)java.util.concurrent包中的線程池來(lái)實(shí)現(xiàn)多線程。關(guān)于線程池的內(nèi)容,我們以后會(huì)詳細(xì)介紹;現(xiàn)在,先對(duì)的Thread和Runnable進(jìn)行了解。本章內(nèi)容包括:
Thread和Runnable的簡(jiǎn)介
Thread和Runnable的異同點(diǎn)
Thread和Runnable的多線程的示例
Thread和Runnable簡(jiǎn)介
Runnable 是一個(gè)接口,該接口中只包含了一個(gè)run()方法。它的定義如下:
public interface Runnable { public abstract void run();
}
Runnable的作用,實(shí)現(xiàn)多線程。我們可以定義一個(gè)類(lèi)A實(shí)現(xiàn)Runnable接口;然后,通過(guò)new Thread(new A())等方式新建線程。
Thread 是一個(gè)類(lèi)。Thread本身就實(shí)現(xiàn)了Runnable接口。它的聲明如下:
public class Thread implements Runnable {}
Thread的作用,實(shí)現(xiàn)多線程。
Thread和Runnable的異同點(diǎn)
Thread 和 Runnable 的相同點(diǎn):都是“多線程的實(shí)現(xiàn)方式”。
Thread 和 Runnable 的不同點(diǎn):
Thread 是類(lèi),而Runnable是接口;Thread本身是實(shí)現(xiàn)了Runnable接口的類(lèi)。我們知道“一個(gè)類(lèi)只能有一個(gè)父類(lèi),但是卻能實(shí)現(xiàn)多個(gè)接口”,因此Runnable具有更好的擴(kuò)展性。
此外,Runnable還可以用于“資源的共享”。即,多個(gè)線程都是基于某一個(gè)Runnable對(duì)象建立的,它們會(huì)共享Runnable對(duì)象上的資源。
通常,建議通過(guò)“Runnable”實(shí)現(xiàn)多線程!
Thread和Runnable的多線程示例
1. Thread的多線程示例
下面通過(guò)示例更好的理解Thread和Runnable,借鑒網(wǎng)上一個(gè)例子比較具有說(shuō)服性的例子。
1 // ThreadTest.java 源碼
2 class MyThread extends Thread{
3 private int ticket=10;
4 public void run(){
5 for(int i=0;i<20;i++){
6 if(this.ticket>0){
7 System.out.println(this.getName()+" 賣(mài)票:ticket"+this.ticket--);
8 }
9 }
10 }
11 };
12
13 public class ThreadTest {
14 public static void main(String[] args) {
15 // 啟動(dòng)3個(gè)線程t1,t2,t3;每個(gè)線程各賣(mài)10張票!
16 MyThread t1=new MyThread();
17 MyThread t2=new MyThread();
18 MyThread t3=new MyThread();
19 t1.start();
20 t2.start();
21 t3.start();
22 }
23 }
運(yùn)行結(jié)果:
Thread-0 賣(mài)票:ticket10
Thread-1 賣(mài)票:ticket10
Thread-2 賣(mài)票:ticket10
Thread-1 賣(mài)票:ticket9
Thread-0 賣(mài)票:ticket9
Thread-1 賣(mài)票:ticket8
Thread-2 賣(mài)票:ticket9
Thread-1 賣(mài)票:ticket7
Thread-0 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket6
Thread-2 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket5
Thread-0 賣(mài)票:ticket7
Thread-1 賣(mài)票:ticket4
Thread-2 賣(mài)票:ticket7
Thread-1 賣(mài)票:ticket3
Thread-0 賣(mài)票:ticket6
Thread-1 賣(mài)票:ticket2
Thread-2 賣(mài)票:ticket6
Thread-2 賣(mài)票:ticket5
Thread-2 賣(mài)票:ticket4
Thread-1 賣(mài)票:ticket1
Thread-0 賣(mài)票:ticket5
Thread-2 賣(mài)票:ticket3
Thread-0 賣(mài)票:ticket4
Thread-2 賣(mài)票:ticket2
Thread-0 賣(mài)票:ticket3
Thread-2 賣(mài)票:ticket1
Thread-0 賣(mài)票:ticket2
Thread-0 賣(mài)票:ticket1
結(jié)果說(shuō)明:
(01) MyThread繼承于Thread,它是自定義個(gè)線程。每個(gè)MyThread都會(huì)賣(mài)出10張票。
(02) 主線程main創(chuàng)建并啟動(dòng)3個(gè)MyThread子線程。每個(gè)子線程都各自賣(mài)出了10張票。
2. Runnable的多線程示例
下面,我們對(duì)上面的程序進(jìn)行修改。通過(guò)Runnable實(shí)現(xiàn)一個(gè)接口,從而實(shí)現(xiàn)多線程。
1 // RunnableTest.java 源碼
2 class MyThread implements Runnable{
3 private int ticket=10;
4 public void run(){
5 for(int i=0;i<20;i++){
6 if(this.ticket>0){
7 System.out.println(Thread.currentThread().getName()+" 賣(mài)票:ticket"+this.ticket--);
8 }
9 }
10 }
11 };
12
13 public class RunnableTest {
14 public static void main(String[] args) {
15 MyThread mt=new MyThread();
16
17 // 啟動(dòng)3個(gè)線程t1,t2,t3(它們共用一個(gè)Runnable對(duì)象),這3個(gè)線程一共賣(mài)10張票!
18 Thread t1=new Thread(mt);
19 Thread t2=new Thread(mt);
20 Thread t3=new Thread(mt);
21 t1.start();
22 t2.start();
23 t3.start();
24 }
25 }
運(yùn)行結(jié)果:
Thread-0 賣(mài)票:ticket10
Thread-2 賣(mài)票:ticket8
Thread-1 賣(mài)票:ticket9
Thread-2 賣(mài)票:ticket6
Thread-0 賣(mài)票:ticket7
Thread-2 賣(mài)票:ticket4
Thread-1 賣(mài)票:ticket5
Thread-2 賣(mài)票:ticket2
Thread-0 賣(mài)票:ticket3
Thread-1 賣(mài)票:ticket1
結(jié)果說(shuō)明:
(01) 和上面“MyThread繼承于Thread”不同;這里的MyThread實(shí)現(xiàn)了Thread接口。
(02) 主線程main創(chuàng)建并啟動(dòng)3個(gè)子線程,而且這3個(gè)子線程都是基于“mt這個(gè)Runnable對(duì)象”而創(chuàng)建的。運(yùn)行結(jié)果是這3個(gè)子線程一共賣(mài)出了10張票。這說(shuō)明它們是共享了MyThread接口的。
在學(xué)習(xí)過(guò)程中遇到任何技術(shù)上的問(wèn)題沒(méi)有及時(shí)解決,推薦一個(gè)不錯(cuò)的微信公眾號(hào):【拓勝科技】會(huì)有專(zhuān)業(yè)的技術(shù)人員為你解決。【拓勝科技】專(zhuān)注于分享最全的編程開(kāi)發(fā)視頻學(xué)習(xí)資料、學(xué)習(xí)經(jīng)驗(yàn)。目前已經(jīng)整理出Java,Android,UID,PHP,iOS等等教學(xué)視頻,
|
|