(一)
實現多線程有兩種方式
(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的很大的優點就在於資源共享。
