多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口java
同步的實現方面有兩種,分別是synchronized,wait與notify多線程
先看一下java線程運行時各個階段的運行狀態
java實現多線程有兩種方法this
一、繼承Thread類spa
二、實現Runnable接口線程
這兩種方法的共同點:對象
不論用哪一種方法,都必須用Thread(若是是Thead子類就用它自己)產生線程,而後再調用start()方法。繼承
兩種方法的不一樣點:接口
一、繼承Thread類有一個缺點就是單繼承,而實現Runnable接口則彌補了它的缺點,能夠實現多繼承資源
二、繼承Thread類必須若是產生Runnable實例對象,就必須產生多個Runnable實例對象,而後再用Thread產生多個線程;而實現Runnable接口,只須要創建一個實現這個類的實例,而後用這一個實例對象產生多個線程。即實現了資源的共享性
基於以上兩點因此建議用第二種方法
同步
下面用例子來作說明
程序1:
package com.dr.runnable1;
//一個類只要繼承了Thread類,則此類就是多線程類
class MyThread extends Thread
{
private String name;
public MyThread(String name)
{
this.name=name;
}
//若是要使用多線程,則必須有一個方法的主體
public void run()
{
//打印輸出
for(int i=0;i<10;i++)
{
System.out.println(this.name+"----->運行、、、、");
}
}
}
public class Demo1 {
public static void main(String args[])
{
//第一種方法
Runnable r1=new MyThread("線程A");
Runnable r2=new MyThread("線程B");
Runnable r3=new MyThread("線程C");
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
Thread t3=new Thread(r3);
t1.start();
t2.start();
t3.start();
// mt1.run();//線程執行,使用start方法
// mt2.run();
// mt3.run();
//第二種方法
// MyThread mt1=new MyThread("線程A");
// MyThread mt2=new MyThread("線程B");
// MyThread mt3=new MyThread("線程C");
// mt1.start();
// mt1.start();//線程只能啓動一次
// mt2.start();
// mt3.start();
}
}
程序的運行結果是:
這是繼承了Thread類,第一種方法產生多個Runnable實例對象,而後用Thread產生多個線程
第二種方法,由於這個類已經繼承了Thread類,因此就能夠直接利用它自己產生多個線程
程序2:
package com.dr.runnable1;
class MyThread1 implements Runnable
{
private int ticket=10;
public void run()
{
for(int i=0;i<500;i++)
{
if(this.ticket>0)
{
System.out.println("賣票----->"+(this.ticket--));
}
}
}
}
public class Demo2 {
public static void main(String args[])
{
MyThread1 mt=new MyThread1();
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
程序運行結果:
這個程序是實現Runnable了,產生一類的實例對象,而後用Thread產生多個線程。