1. 程式人生 > >建立執行緒的兩種方法和同步執行緒的問題

建立執行緒的兩種方法和同步執行緒的問題

執行緒有兩種建立方式:

1,       繼承Thread類,覆寫Run方法。建立子類物件的同時執行緒也被建立。

2,       實現Runnable介面,再通過Thread類建立執行緒,並將事先了Runnable介面的子類物件作為引數傳遞給Thread類的建構函式。使用匿名內部類來寫。

方法一原始碼:

class ThreadDemo extends Thread{

   private String name;

   private int num =100;

   public ThreadDemo(String name){

      super();

      this.name=name

;

   }

   public  void run(){

      for(int i=0;i<num;i++){

      System.out.println(name+"發了"+i+"份傳單");

   }

}

方法二:

class MyThread implements Runnable{

   private String name;

   public MyThread(String name) {

      super();

      this.name =name;

   }

   @Override

   public void run() {

      for

(int i=0;i<100;i++){

         System.out.println(name+"發了"+i+"禮物");

      }

   }

   }

執行緒安全問題:有可能出現問題的三種情況:1,多執行緒,2有共享資料,3有多條語句操作共享資料。

原始碼:

class MyThread implements Runnable{

   int num =100;

   private String name;

   public MyThread(){}

   public MyThread(String name) {

      super();

      this.name

=name;

   }

   @Override

   public  void  run() {

      for(int i=0;i<200;i++){

      synchronized (this) {

         if(num>0){

      System.out.println(Thread.currentThread().getName()+"發了"+num--+"禮物");

         }}

      }

   }

}

public class Test4 {

   public static void main(String[] args) {

      MyThread my =new MyThread();

      new Thread(my,"ddss").start();

      new Thread(my,"sssa").start();

   }

}

分析:這個是典型的多執行緒問題,使用了synchronized來鎖住程式碼塊。1,多執行緒:主程式中new了2個執行緒。2,有共享資料:執行緒處理了都是My的物件,而這個類是實現賣票的功能,有共同的資料。3,有多條語句操作共同資料,這是顯然的。

解決方法:除了用synchronized來鎖住程式碼塊以外,還可以用synchronized來修飾方法,把該方法鎖住。

當執行緒進該程式塊後,必須得全部執行完畢,其他執行緒才能執行,就不會出現搶佔問題和資料錯誤。