(一)
步驟:
1.定義實現Runnable介面
2.覆蓋Runnable介面中的run方法,將線程要啟動並執行代碼存放在run方法中。
3.通過Thread類建立線程對象。
4.將Runnable介面的子類對象作為實際參數傳遞給Thread類的建構函式。
為什麼要講Runnable介面的子類對象傳遞給Thread的構造方法。因為自訂的方法的所屬的對象是Runnable介面的子類對象。
5.調用Thread類的start方法開啟線程並調用Runnable介面子類run方法。
(二)安全執行緒的共用代碼塊問題
目的:程式是否存在安全問題,如果有,如何解決?
如何找問題:
1.明確哪些代碼是多線程運行代碼。
2.明確共用資料
3.明確多線程運行代碼中哪些語句是操作共用資料的。
class Bank{private int sum;public void add(int n){ sum+=n; System.out.println("sum="+sum);}} class Cus implements Runnable{ private Bank b=new Bank(); public void run(){ synchronized(b){ for(int x=0;x<3;x++) {b.add(100); } } }}public class BankDemo{ public static void main(String []args){ Cus c=new Cus();Thread t1=new Thread(c);Thread t2=new Thread(c);t1.start();t2.start();}}
或者第二種方式,將同步代碼synchronized放在修飾方法中。
class Bank{private int sum;public synchronized void add(int n){ Object obj=new Object(); sum+=n; try{ Thread.sleep(10); }catch(Exception e){ e.printStackTrace(); } System.out.println("sum="+sum); }} class Cus implements Runnable{ private Bank b=new Bank(); public void run(){ for(int x=0;x<3;x++) {b.add(100); } }}public class BankDemo{ public static void main(String []args){ Cus c=new Cus();Thread t1=new Thread(c);Thread t2=new Thread(c);t1.start();t2.start();}}總結:
1.在一個類中定義要處理的問題,方法。
2.在實現Runnable的類中重寫run方法中去調用已經定義的類中的要處理問題的方法。
在synchronized塊中接受要處理問題那個類的對象。
3.在main方法中去定義多個線程去執行。