本節(jié)摘要:介紹創(chuàng)建線程的兩種基本方式Thread,Runnable,并比較兩者的區(qū)別和聯(lián)系,最后通過實例進行演示
一、Thread 和 Runnable異同點
相同點 | 區(qū)別 |
---|---|
可以實現(xiàn)多線程 | 1. Thread是類,Runnable是接口 2. 線程可以驅(qū)動任務(wù)(java編程思想),那么Thread是線程,Runnable是任務(wù) 3. Runnable可以實現(xiàn)資源共享 |
二、實現(xiàn)多線程的方式
2.1 Runnable:Runnable只包含一個接口,它實際上是一個函數(shù)式接口,可以通過實現(xiàn)Runnable接口來描述一種任務(wù)
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
實現(xiàn)多線程的方式為以下兩步:
(1) class MyRunnable implements Runnable{}
(2) Thread t = new Thread(new MyRunnable()); t.start();
2.2 Thread:Thread實現(xiàn)了Runnable接口,它本身是一個類
public class Thread implements Runnable {}
實現(xiàn)多線程的方式為:
(1)class MyThread extends Thread{}
(2)Thread t = new MyThread(); t.start();
對于"Runnable是任務(wù)"這句話的理解:
查看Thread類的源碼,發(fā)現(xiàn)Thread 的run()方法如下:
@Override
public void run() {
if (target != null) {
target.run();
}
}
這里的target實際就是Runnable對象,通過Thread的構(gòu)造函數(shù)傳進來的
三、示例:我們以售賣mix2為例演示Thread 和Runnable的用法,假設(shè)本次只能售賣10臺mix2
public class MyRunnable implements Runnable {
private int num = 10;
public static void main(String[] args) {
Runnable runnable = new MyRunnable();
//runnable 可以實現(xiàn)資源共享,下面3個線程共享一個runnable,一共賣了10部Mix2
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
Thread t3 = new Thread(runnable);
t1.start();
t2.start();
t3.start();
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
synchronized (this) {
//2個線程
if (this.num > 0) {
System.out.println(Thread.currentThread().getName() + ",num:" + num--);
}
}
Thread.yield();
}
}
}
輸出內(nèi)容如下(輸出會有不同):
Thread-0,num:10
Thread-1,num:9
Thread-1,num:8
Thread-1,num:7
Thread-1,num:6
Thread-1,num:5
Thread-1,num:4
Thread-1,num:3
Thread-1,num:2
Thread-1,num:1
可以看到,我們啟動3個線程,共享一個runnable實例,一共只賣出10部mix2
下面以Thread為例:
public class ThreadExample extends Thread {
private int num = 10;
public static void main(String[] args) {
ThreadExample t1 = new ThreadExample();
ThreadExample t2 = new ThreadExample();
ThreadExample t3 = new ThreadExample();
t1.start();
t2.start();
t3.start();
}
public void run() {
for (int i = 0; i < 20; i++) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()+"---"+num--);
}
}
}
}
輸出結(jié)果:
Thread-0---10
Thread-0---9
Thread-0---8
Thread-0---7
Thread-0---6
Thread-0---5
Thread-0---4
Thread-0---3
Thread-0---2
Thread-0---1
Thread-1---10
Thread-1---9
Thread-1---8
Thread-1---7
Thread-1---6
Thread-1---5
Thread-1---4
Thread-1---3
Thread-1---2
Thread-1---1
Thread-2---10
Thread-2---9
Thread-2---8
Thread-2---7
Thread-2---6
Thread-2---5
Thread-2---4
Thread-2---3
Thread-2---2
Thread-2---1
可以看到,每個線程都賣出10部mix2,這不符合我們的預(yù)期
四、總結(jié)
繼承Thread和實現(xiàn)Runnable接口都可以實現(xiàn)多線程,Runnable可以實現(xiàn)資源共享
轉(zhuǎn)載請注明作者及出處,并附上鏈接http://www.lxweimin.com/u/ada8c4ee308b