Runnable
步驟:
1.定義實現(xiàn)Runnable接口
2.覆蓋Runnable接口的方法,將線程要運行的代碼方法方法放到run方發(fā)中矾瑰。
3.通過Thread類建立線程對象。
4.將Runnable接口的子類對象作為實際參數(shù)傳遞給Thread類的構(gòu)造函數(shù)
為什么要講Runnable接口的子類對象傳遞給Thread的構(gòu)造方法隘擎。因為自定義的方法所屬的對象是Runnable接口的子類對象殴穴。
5.調(diào)用Thread類的Start方法開啟線程并調(diào)用Runnable接口子類方法run方法。
線程安全的共享代碼塊問題
目的:程序是否存在安全問題货葬,如果有采幌,如何解決:
如何找問題?
1.明確哪些代碼是多線程運行代碼
2.明確共享數(shù)據(jù)
3.明確多線程運行代碼中哪些語句是操作共享數(shù)據(jù)的
class Bank{
private int sum;
public void add(int n){//自定義的方法所屬的對象是Runnable接口的子類對象震桶。
sum+=n;
System.out.println("sum="+sum);
}
}
class Cus implements Runnable{ ? //1.定義實現(xiàn)Runnable接口
private Bank bank = new Bank();
@Override
public void run() {//2.覆蓋Runnable接口的方法休傍,將線程要運行的代碼方法方法放到run方發(fā)中
synchronized (bank) {
for(int x = 0;x<3;x++){
bank.add(100);
}
}
}
}
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Cus cus = new Cus();
//3.通過Thread類建立線程對象。
//4.將Runnable接口的子類對象作為實際參數(shù)傳遞給Thread類的構(gòu)造函數(shù)
Thread t1 = new Thread(cus);
Thread t2 = new Thread(cus);
//5.調(diào)用Thread類的Start方法開啟線程并調(diào)用Runnable接口子類方法run方法蹲姐。
t1.start();
t2.start();
}
}
將synchronized加在方法中
class Bank{
private int sum;
public synchronized void add(int n) throws InterruptedException{
sum+=n;
Thread.sleep(1000);
System.out.println("sum="+sum);
}
}
class Cus implements Runnable{
private Bank bank = new Bank();
public void run(){
for(int i=0;i<3;i++){
try {
bank.add(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Demo2{
public static void main(String []args){
Cus cus = new Cus();
Thread t1 = new Thread(cus);
Thread t2 =new Thread(cus);
t1.start();
t2.start();
}
}