91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解多線程及Runable 和Thread的區別

發布時間:2020-09-30 22:06:09 來源:腳本之家 閱讀:128 作者:qq_43499096 欄目:編程語言

詳解多線程及Runable 和Thread的區別

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的區別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明星| 巴青县| 株洲市| 页游| 晋中市| 西贡区| 宣武区| 雷山县| 榕江县| 博爱县| 吐鲁番市| 延津县| 西贡区| 定南县| 洛浦县| 张家界市| 阿鲁科尔沁旗| 拉萨市| 灵寿县| 平远县| 襄樊市| 巴林右旗| 石阡县| 肇东市| 大宁县| 福泉市| 自治县| 榆社县| 本溪市| 宁蒗| 刚察县| 汶川县| 洮南市| 高陵县| 元阳县| 礼泉县| 崇阳县| 平阳县| 黄骅市| 宾阳县| 安化县|