JAVA多线程实现Runnable方式



(一)

步骤:

 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.          System.out.println("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.             b.add(100);  
  20.            
  21.          }  
  22.      }  
  23.    }  
  24.   
  25. }  
  26. public class BankDemo{  
  27.     public static void main(String []args){  
  28.         Cus c=new Cus();  
  29.         Thread t1=new Thread(c);  
  30.         Thread t2=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.         Object obj=new Object();  
  6.            
  7.           sum+=n;  
  8.          try{  
  9.               Thread.sleep(10);  
  10.          }catch(Exception e){  
  11.            e.printStackTrace();  
  12.          }  
  13.          System.out.println("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.             b.add(100);  
  26.            
  27.          }  
  28.        
  29.    }  
  30.   
  31. }  
  32. public class BankDemo{  
  33.     public static void main(String []args){  
  34.         Cus c=new Cus();  
  35.         Thread t1=new Thread(c);  
  36.         Thread t2=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.      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值