您好,登錄后才能下訂單哦!
Thread和Runnable區別
執行多線程操作可以選擇
繼承Thread類
實現Runnable接口
1.繼承Thread類
以賣票窗口舉例,一共5張票,由3個窗口進行售賣(3個線程)。
代碼:
package thread; public class ThreadTest { public static void main(String[] args) { MyThreadTest mt1 = new MyThreadTest("窗口1"); MyThreadTest mt2 = new MyThreadTest("窗口2"); MyThreadTest mt3 = new MyThreadTest("窗口3"); mt1.start(); mt2.start(); mt3.start(); } } class MyThreadTest extends Thread{ private int ticket = 5; private String name; public MyThreadTest(String name){ this.name = name; } public void run(){ while(true){ if(ticket < 1){ break; } System.out.println(name + " = " + ticket--); } } }
執行結果:
窗口1 = 5
窗口1 = 4
窗口1 = 3
窗口1 = 2
窗口1 = 1
窗口2 = 5
窗口3 = 5
窗口2 = 4
窗口3 = 4
窗口3 = 3
窗口3 = 2
窗口3 = 1
窗口2 = 3
窗口2 = 2
窗口2 = 1
結果一共賣出了5*3=15張票,這違背了"5張票"的初衷。
造成此現象的原因就是:
MyThreadTest mt1 = new MyThreadTest("窗口1"); MyThreadTest mt2 = new MyThreadTest("窗口2"); MyThreadTest mt3 = new MyThreadTest("窗口3"); mt1.start(); mt2.start(); mt3.start();
一共創建了3個MyThreadTest對象,而這3個對象的資源不是共享的,即各自定義的ticket=5是不會共享的,因此3個線程都執行了5次循環操作。
2.實現Runnable接口
同樣的例子,代碼:
package thread; public class RunnableTest { public static void main(String[] args) { MyRunnableTest mt = new MyRunnableTest(); Thread mt1 = new Thread(mt,"窗口1"); Thread mt2 = new Thread(mt,"窗口2"); Thread mt3 = new Thread(mt,"窗口3"); mt1.start(); mt2.start(); mt3.start(); } } class MyRunnableTest implements Runnable{ private int ticket = 5; public void run(){ while(true){ if(ticket < 1){ break; } System.out.println(Thread.currentThread().getName() + " = " + ticket--); } } }
結果:
窗口1 = 5
窗口1 = 2
窗口3 = 4
窗口2 = 3
窗口1 = 1
結果賣出了預期的5張票。
原因在于:
MyRunnableTest mt = new MyRunnableTest(); Thread mt1 = new Thread(mt,"窗口1"); Thread mt2 = new Thread(mt,"窗口2"); Thread mt3 = new Thread(mt,"窗口3"); mt1.start(); mt2.start(); mt3.start();
只創建了一個MyRunnableTest對象,而3個Thread線程都以同一個MyRunnableTest來啟動,所以他們的資源是共享的。
以上所述是小編給大家介紹的多線程及Runable 和Thread的區別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。