class MThread extends Thread{
PRivate int ticket = 10; private String name; public MThread(String name){ this.name =name; } public void run(){ for(int i =0;i<1000;i++){ if(this.ticket>0){ System.out.println(this.name+"賣票---->"+(this.ticket--)); } } }}
public class test33{public static void main(String[] args) {MThread mt1= new MThread("一號窗口"); MThread mt2= new MThread("二號窗口"); MThread mt3= new MThread("三號窗口"); mt1.run(); mt2.run(); mt3.run();
}}
結果為:
一號窗口賣票---->10一號窗口賣票---->9一號窗口賣票---->8一號窗口賣票---->7一號窗口賣票---->6一號窗口賣票---->5一號窗口賣票---->4一號窗口賣票---->3一號窗口賣票---->2一號窗口賣票---->1二號窗口賣票---->10二號窗口賣票---->9二號窗口賣票---->8二號窗口賣票---->7二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4二號窗口賣票---->3二號窗口賣票---->2二號窗口賣票---->1三號窗口賣票---->10三號窗口賣票---->9三號窗口賣票---->8三號窗口賣票---->7三號窗口賣票---->6三號窗口賣票---->5三號窗口賣票---->4三號窗口賣票---->3三號窗口賣票---->2三號窗口賣票---->1
結果分析: 看看運行結果,先執行第一個對象的run(),然后執行第二個對象的run(),并沒有啟動新線程。
class MThread extends Thread{
private int ticket = 10; private String name; public MThread(String name){ this.name =name; } public void run(){ for(int i =0;i<1000;i++){ if(this.ticket>0){ System.out.println(this.name+"賣票---->"+(this.ticket--)); } } }}
public class test33{public static void main(String[] args) {MThread mt1= new MThread("一號窗口"); MThread mt2= new MThread("二號窗口"); MThread mt3= new MThread("三號窗口"); mt1.start(); mt2.start(); mt3.start();
}}
結果為:
二號窗口賣票---->10二號窗口賣票---->9二號窗口賣票---->8二號窗口賣票---->7一號窗口賣票---->10二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4二號窗口賣票---->3二號窗口賣票---->2二號窗口賣票---->1一號窗口賣票---->9一號窗口賣票---->8一號窗口賣票---->7一號窗口賣票---->6一號窗口賣票---->5一號窗口賣票---->4一號窗口賣票---->3一號窗口賣票---->2一號窗口賣票---->1三號窗口賣票---->10三號窗口賣票---->9三號窗口賣票---->8三號窗口賣票---->7三號窗口賣票---->6三號窗口賣票---->5三號窗口賣票---->4三號窗口賣票---->3三號窗口賣票---->2三號窗口賣票---->1
結果分析: 1. 看看運行結果,兩個線程正常完成交互運行。說明start()方法是新建了一個線程去執行run()方法。 2. 兩個線程訪問的run()方法都是獨立的,對應的MyThread類成員變量ticket也是獨立。資源不能共享。public class test33{public static void main(String[] args) { MRunable mr=new MRunable(); Thread mr1=new Thread(mr,"一號窗口"); Thread mr2=new Thread(mr,"二號窗口"); Thread mr3=new Thread(mr,"三號窗口"); mr1.start(); mr2.start(); mr3.start();}}
結果為:
一號窗口賣票---->10二號窗口賣票---->8二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4一號窗口賣票---->7一號窗口賣票---->2一號窗口賣票---->1二號窗口賣票---->3三號窗口賣票---->9
結果分析: 1. 使用Runnable對象時,Runnable定義的子類沒有start()方法,只有Thread類中才有,觀察Thread類,有一個構造方法public Thread(Runnable target),此構造方法接受Runanble的子類實例,也就是說可以通過Thread類來啟動Runnable實現多線程。 2. 每個線程調用的都是同一個MyRunnable對象的run()方法,訪問的是同一個對象中的變量ticket實例。
實際開發中我們通常采用Runnable接口來實現多線程。因為實現Runnable接口比繼承Thread類有如下好處: 1. 避免繼承的局限,一個類可以繼承多個接口,但是類只能繼承一個類。 2. Runnable接口實現的線程便于資源共享。而通過Thread類實現,各自線程的資源是獨立的,不方便共享。
實現Runnable接口比繼承Thread類所具有的優勢:
(1):適合多個相同的程序代碼的線程去處理同一個資源
(2):可以避免java中的單繼承的限制
(3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立
新聞熱點
疑難解答