Runnable,Thread實現多線程以及Runnable的同步資源共享


(一)

     實現多線程有兩種方式

    (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的很大的優點就在於資源共享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM