(一)

步骤:

 1.定义实现Runnable接口

 2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。

3.通过Thread类建立线程对象。

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

  为什么要讲Runnable接口的子类对象传递给Thread的构造方法。因为自定义的方法的所属的对象是Runnable接口的子类对象。

5.调用Thread类的start方法开启线程并调用Runnable接口子类run方法。

(二)线程安全的共享代码块问题

  目的:程序是否存在安全问题,如果有,如何解决?

如何找问题:

1.明确哪些代码是多线程运行代码。

2.明确共享数据

3.明确多线程运行代码中哪些语句是操作共享数据的。



[java]  view plain  copy


1. class Bank{  
2.   
3. private int sum;  
4. public void add(int n){  
5.       
6.          sum+=n;  
7. "sum="+sum);  
8.       
9.     }  
10.   
11. }  
12. class Cus implements Runnable{  
13.   
14. private Bank b=new Bank();  
15. public void run(){  
16. synchronized(b){     
17. for(int x=0;x<3;x++)  
18.          {  
19. 100);  
20.            
21.          }  
22.      }  
23.    }  
24.   
25. }  
26. public class BankDemo{  
27. public static void main(String []args){  
28. new Cus();  
29. new Thread(c);  
30. new Thread(c);  
31.         t1.start();  
32.         t2.start();  
33.       
34.       
35.     }  
36.   
37.   
38. }


[java]  view plain  copy



  1. 或者第二种方式,将同步代码synchronized放在修饰方法中。  



[java]  view plain  copy

1. <pre name="code" class="java">class Bank{  
2.   
3. private int sum;  
4. public synchronized void add(int n){  
5. new Object();  
6.            
7.           sum+=n;  
8. try{  
9. 10);  
10. catch(Exception e){  
11.            e.printStackTrace();  
12.          }  
13. "sum="+sum);  
14.           
15.     }  
16.   
17. }  
18. class Cus implements Runnable{  
19.   
20. private Bank b=new Bank();  
21. public void run(){  
22.          
23. for(int x=0;x<3;x++)  
24.          {  
25. 100);  
26.            
27.          }  
28.        
29.    }  
30.   
31. }  
32. public class BankDemo{  
33. public static void main(String []args){  
34. new Cus();  
35. new Thread(c);  
36. new Thread(c);  
37.         t1.start();  
38.         t2.start();  
39.       
40.       
41.     }  
42.   
43.   
44. }  
45. </pre><br>  
46. <br>  
47. <pre></pre>  
48. 总结:  
49. <p></p>  
50. <p>1.在一个类中定义要处理的问题,方法。</p>  
51. <p>2.在实现Runnable的类中重写run方法中去调用已经定义的类中的要处理问题的方法。</p>  
52. <p>在synchronized块中接受要处理问题那个类的对象。</p>  
53. <p>3.在main方法中去定义多个线程去执行。</p>  
54.

(一)

步骤:

 1.定义实现Runnable接口

 2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。

3.通过Thread类建立线程对象。

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

  为什么要讲Runnable接口的子类对象传递给Thread的构造方法。因为自定义的方法的所属的对象是Runnable接口的子类对象。

5.调用Thread类的start方法开启线程并调用Runnable接口子类run方法。

(二)线程安全的共享代码块问题

  目的:程序是否存在安全问题,如果有,如何解决?

如何找问题:

1.明确哪些代码是多线程运行代码。

2.明确共享数据

3.明确多线程运行代码中哪些语句是操作共享数据的。



[java]  view plain  copy


1. class Bank{  
2.   
3. private int sum;  
4. public void add(int n){  
5.       
6.          sum+=n;  
7. "sum="+sum);  
8.       
9.     }  
10.   
11. }  
12. class Cus implements Runnable{  
13.   
14. private Bank b=new Bank();  
15. public void run(){  
16. synchronized(b){     
17. for(int x=0;x<3;x++)  
18.          {  
19. 100);  
20.            
21.          }  
22.      }  
23.    }  
24.   
25. }  
26. public class BankDemo{  
27. public static void main(String []args){  
28. new Cus();  
29. new Thread(c);  
30. new Thread(c);  
31.         t1.start();  
32.         t2.start();  
33.       
34.       
35.     }  
36.   
37.   
38. }


[java]  view plain  copy



  1. 或者第二种方式,将同步代码synchronized放在修饰方法中。  



[java]  view plain  copy


1. <pre name="code" class="java">class Bank{  
2.   
3. private int sum;  
4. public synchronized void add(int n){  
5. new Object();  
6.            
7.           sum+=n;  
8. try{  
9. 10);  
10. catch(Exception e){  
11.            e.printStackTrace();  
12.          }  
13. "sum="+sum);  
14.           
15.     }  
16.   
17. }  
18. class Cus implements Runnable{  
19.   
20. private Bank b=new Bank();  
21. public void run(){  
22.          
23. for(int x=0;x<3;x++)  
24.          {  
25. 100);  
26.            
27.          }  
28.        
29.    }  
30.   
31. }  
32. public class BankDemo{  
33. public static void main(String []args){  
34. new Cus();  
35. new Thread(c);  
36. new Thread(c);  
37.         t1.start();  
38.         t2.start();  
39.       
40.       
41.     }  
42.   
43.   
44. }  
45. </pre><br>  
46. <br>  
47. <pre></pre>  
48. 总结:  
49. <p></p>  
50. <p>1.在一个类中定义要处理的问题,方法。</p>  
51. <p>2.在实现Runnable的类中重写run方法中去调用已经定义的类中的要处理问题的方法。</p>  
52. <p>在synchronized块中接受要处理问题那个类的对象。</p>  
53. <p>3.在main方法中去定义多个线程去执行。</p>  
54.