三、多線程之Thread與Runnable的區別


Thread與Runnable的區別(用三個窗口同時出售10張車票為例子)

運行代碼
運行結果 分析
System.out.println("開始測試多線程");
class MyThread extends Thread {
private int ticket=10;
private String name;
public MyThread(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒數第" + this.ticket-- + "張票!");
}
}
}
}
Thread thread1 = new MyThread("一號窗");
Thread thread2 = new MyThread("二號窗");
Thread thread3 = new MyThread("三號窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("結束測試多線程");
開始測試多線程
結束測試多線程
一號窗正在出售倒數第10張票!
三號窗正在出售倒數第10張票!
三號窗正在出售倒數第9張票!
三號窗正在出售倒數第8張票!
三號窗正在出售倒數第7張票!
三號窗正在出售倒數第6張票!
三號窗正在出售倒數第5張票!
三號窗正在出售倒數第4張票!
三號窗正在出售倒數第3張票!
三號窗正在出售倒數第2張票!
三號窗正在出售倒數第1張票!
二號窗正在出售倒數第10張票!
一號窗正在出售倒數第9張票!
一號窗正在出售倒數第8張票!
一號窗正在出售倒數第7張票!
一號窗正在出售倒數第6張票!
一號窗正在出售倒數第5張票!
一號窗正在出售倒數第4張票!
一號窗正在出售倒數第3張票!
一號窗正在出售倒數第2張票!
一號窗正在出售倒數第1張票!
二號窗正在出售倒數第9張票!
二號窗正在出售倒數第8張票!
二號窗正在出售倒數第7張票!
二號窗正在出售倒數第6張票!
二號窗正在出售倒數第5張票!
二號窗正在出售倒數第4張票!
二號窗正在出售倒數第3張票!
二號窗正在出售倒數第2張票!
二號窗正在出售倒數第1張票!

出現票超,會出現各窗口自行處理10張。

各個線程完全獨立

System.out.println("開始測試多線程");
class MyRunnable implements Runnable {
private int ticket=10;
private String name;
public MyRunnable(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒數第" + this.ticket-- + "張票!");
}
}
}
}
Thread thread1 = new Thread(new MyRunnable("一號窗"));
Thread thread2 = new Thread(new MyRunnable("二號窗"));
Thread thread3 = new Thread(new MyRunnable("三號窗"));
thread1.start();
thread2.start();
thread3.start();
System.out.println("結束測試多線程");

開始測試多線程
結束測試多線程
一號窗正在出售倒數第10張票!
二號窗正在出售倒數第10張票!
二號窗正在出售倒數第9張票!
二號窗正在出售倒數第8張票!
二號窗正在出售倒數第7張票!
二號窗正在出售倒數第6張票!
一號窗正在出售倒數第9張票!
二號窗正在出售倒數第5張票!
三號窗正在出售倒數第10張票!
三號窗正在出售倒數第9張票!
三號窗正在出售倒數第8張票!
三號窗正在出售倒數第7張票!
三號窗正在出售倒數第6張票!
三號窗正在出售倒數第5張票!
三號窗正在出售倒數第4張票!
三號窗正在出售倒數第3張票!
三號窗正在出售倒數第2張票!
三號窗正在出售倒數第1張票!
二號窗正在出售倒數第4張票!
二號窗正在出售倒數第3張票!
二號窗正在出售倒數第2張票!
二號窗正在出售倒數第1張票!
一號窗正在出售倒數第8張票!
一號窗正在出售倒數第7張票!
一號窗正在出售倒數第6張票!
一號窗正在出售倒數第5張票!
一號窗正在出售倒數第4張票!
一號窗正在出售倒數第3張票!
一號窗正在出售倒數第2張票!
一號窗正在出售倒數第1張票!

出現票超,會出現各窗口自行處理10張。

各個線程完全獨立

System.out.println("開始測試多線程");
class MyRunnable implements Runnable {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在出售倒數第" + this.ticket-- + "張票!");
}
}
}
}
MyRunnable runnable=new MyRunnable();
Thread thread1 = new Thread(runnable,"一號窗");
Thread thread2 = new Thread(runnable,"二號窗");
Thread thread3 = new Thread(runnable,"三號窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("結束測試多線程");

開始測試多線程
結束測試多線程
一號窗正在出售倒數第10張票!
一號窗正在出售倒數第7張票!
一號窗正在出售倒數第6張票!
一號窗正在出售倒數第5張票!
一號窗正在出售倒數第4張票!
一號窗正在出售倒數第3張票!
一號窗正在出售倒數第2張票!
一號窗正在出售倒數第1張票!
三號窗正在出售倒數第8張票!
二號窗正在出售倒數第9張票!

票數正常,各窗口以剩下的票數出售。

線程共同使用類,但運行多次會發現

有些窗口出售同樣的票,意味並發時

會出現同票出售。

 

總結:

采用繼承Thread類方式:
 (1)優點:編寫簡單,如果需要訪問當前線程,無需使用Thread.currentThread()方法,直接使用this,即可獲得當前線程。
 (2)缺點:因為線程類已經繼承了Thread類,所以不能再繼承其他的父類。
采用實現Runnable接口方式:
 (1)優點:線程類只是實現了Runable接口,還可以繼承其他的類。在這種方式下,可以多個線程共享同一個目標對象,所以非常適合多個相同線程來處理同一份資                源的情況。
 (2)缺點:編程稍微復雜,如果需要訪問當前線程,必須使用Thread.currentThread()方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM