本文為大家分享了Java多線程實(shí)現(xiàn)Runnable方式的具體方法,供大家參考,具體內(nèi)容如下
(一)步驟
1.定義實(shí)現(xiàn)Runnable接口
2.覆蓋Runnable接口中的run方法,將線程要運(yùn)行的代碼存放在run方法中。
3.通過Thread類建立線程對(duì)象。
4.將Runnable接口的子類對(duì)象作為實(shí)際參數(shù)傳遞給Thread類的構(gòu)造函數(shù)。
為什么要講Runnable接口的子類對(duì)象傳遞給Thread的構(gòu)造方法。因?yàn)樽远x的方法的所屬的對(duì)象是Runnable接口的子類對(duì)象。
5.調(diào)用Thread類的start方法開啟線程并調(diào)用Runnable接口子類run方法。
(二)線程安全的共享代碼塊問題
目的:程序是否存在安全問題,如果有,如何解決?
如何找問題:
1.明確哪些代碼是多線程運(yùn)行代碼。
2.明確共享數(shù)據(jù)
3.明確多線程運(yùn)行代碼中哪些語句是操作共享數(shù)據(jù)的。
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(); } }
總結(jié):
1.在一個(gè)類中定義要處理的問題,方法。
2.在實(shí)現(xiàn)Runnable的類中重寫run方法中去調(diào)用已經(jīng)定義的類中的要處理問題的方法。
在synchronized塊中接受要處理問題那個(gè)類的對(duì)象。
3.在main方法中去定義多個(gè)線程去執(zhí)行。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選