(一)
實現多線程有兩種方式
(1)
繼承Thread類,重寫run()方法,如以下例子
class MyThread extends Thread{
public void run(){
//
}
}
class Main{
public void main(String[] args){
MyThread thread=new Mythread();
thread.start();
}
}
(2)
利用runnable接口實現,但是若只是定義了Runnable對象,如
public class Myobject { public static void main(String[] args) { //System.out.println("主線程" + Thread.currentThread().getName()); Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }; } }
Runnable對象必須依賴一個Thread類才能真正意義上說是另外開辟了一個線程,不然是默認在主線程中的,在Android更新UI有這種應用,利用runOnUiThread(runnable)來在主線程的某一塊調用Runnable的run方法,此時並沒有開辟另外的線程,而是在主線程中執行的,這一點應該分清楚。
真正意義上的開辟另外的線程看下面,需要Thread.start()來調用Runnable接口的run方法
class MyThread implements Runnable{
public void run(){
//
}
}
class Main{
public static void main(String[] args){
MyThread thread=new MyThread();//實例化runnable對象
Thread thread1=new Thread(thread);//通過Thread實例化runnable對象
thread1.start();//利用Thread線程類啟動Runnable接口的run方法
}
}
(二)在利用Runnable進行多線程時,則有時候需要資源共享
當分配一個任務給多人時,假如要實現資源共享那么就用到
synchronized (this){
同步代碼塊
}
那我們就舉個買票的例子
定義個ThreadTicket類
package MyThread; public class ThreadTicket { public static void main(String[] args) { MyThread myThread1=new MyThread(); Thread t1 = new Thread(myThread1);//一窗口 Thread t2 = new Thread(myThread1);//二窗口 Thread t3 = new Thread(myThread1);//三窗口 t1.start(); t2.start(); t3.start(); } }
此時的實現MyThread接口類
package MyThread; public class MyThread implements Runnable { private int ticket = 10; @Override public void run() { //synchronized (this) //{ for (int i = 0; i < 10; i++) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } if (ticket > 0) System.out.println("車票 :" + ticket--); } //} } }
由MyThread類可以得出此時的購票總數是10張票,分三個窗口買,那么此時就需要三個窗口共享票源,當沒票時就不再進行售票
當不添加synchronized關鍵字時,此時顯示的結果為
可以看到此時的結果是雜亂無章,完全沒有達到資源共享
此時應該利用synchronized(this)
{
//code
}
同步代碼塊來實現資源共享
就是將MyThread的synchronized部分注釋解除,此時的結果為
成功實現了資源共享的目的。
Runnable的很大的優點就在於資源共享。