Java初学习 - Runnable接口 和 同步代码块synchronized

[java]  view plain copy
  1. /* 
  2.     需求: 实现一个售票程序 
  3.      
  4.     创建线程的第二种方式:实现Runnable接口 
  5.  
  6.     步骤: 
  7.     1,定义类实现Runnable接口 
  8.     2,覆盖Runnable接口中的run方法 
  9.         将线程要运行的代码存放在该run方法中 
  10.  
  11.     3,通过Thread 类建立线程对象 
  12.     4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数 
  13.         为什么要将Runnable接口中的子类对象传递给Thread的构造函数 
  14.         因为,自定义的run方法所属的对象是Runnable接口的子类对象 
  15.         所以要让线程去指定指定对象的run方法,就必须明确该run方法所属对象。 
  16.  
  17.     5,调用Thread类的start方法 开启线程并调用Runnable接口子类的run方法 
  18.  
  19.  
  20.  
  21. 实现方式和继承方式的区别: 
  22.  
  23. 实现方式好处:避免了单继承的局限性 
  24. 在定义建议使用实现方式 
  25.  
  26. 两种方式区别: 
  27. 继承Thread:线程代码存放在Thread子类run方法中。 
  28. 实现Runnable:线程代码存放在接口的子类的run方法中、 
  29. */  
  30.   
  31. class Tick implements Runnable  
  32. {  
  33.     private int tick = 50;  
  34.   
  35.     public void run()  
  36.     {  
  37.         while(true)  
  38.         {  
  39.             if(tick > 0)  
  40.                 System.out.println( Thread.currentThread().getName() + " sail --" + tick--);  
  41.         }  
  42.     }  
  43. }  
  44.   
  45. class TickDemo  
  46. {  
  47.     public static void main(String []args)  
  48.     {  
  49.         Tick t = new Tick();  
  50.   
  51.         Thread t1 = new Thread(t);  
  52.         Thread t2 = new Thread(t);  
  53.         Thread t3 = new Thread(t);  
  54.         Thread t4 = new Thread(t);  
  55.   
  56.         t1.start();  
  57.         t2.start();  
  58.         t3.start();  
  59.         t4.start();  
  60.   
  61.     }  
  62. }  


[java]  view plain copy
  1. /* 
  2.  
  3. JAVA对于多线程的安全问题提供了专业的解决方式 
  4.  
  5. 就是同步代码块 
  6.  
  7. synchronized(对象)//这个对象可以为任意对象 
  8. { 
  9.     需要被同步的代码 
  10. } 
  11.  
  12. 对象如同锁,持有锁的线程可以在同步中执行 
  13. 没持有锁的线程即使获取CPU的执行权,也进不去 
  14.  
  15.  
  16. 同步的前提: 
  17. 1,必须要有两个或者两个以上的线程 
  18. 2,必须是多个线程使用同一个锁 
  19.      
  20. 必须保证同步中只能有一个线程在运行 
  21.  
  22. 好处:解决了多线程的安全问题 
  23.  
  24. 弊端:多个线程需要判断锁,较为消耗资源 
  25. */  
  26.   
  27. class Tick implements Runnable  
  28. {  
  29.     private int tick = 50;  
  30.   
  31.     Object obj = new Object();//申请一个对象  
  32.   
  33.     public void run()  
  34.     {  
  35.   
  36.         while(true)  
  37.         {  
  38.             synchronized(obj)  
  39.             {  
  40.                 if(tick > 0)  
  41.                 {  
  42.                     //try{Thread.sleep(40);}catch(Exception e){}  
  43.                     System.out.println( Thread.currentThread().getName() + " sail --" + tick--);  
  44.                 }     
  45.             }  
  46.         }  
  47.     }  
  48. }  
  49.   
  50. class TickDemo  
  51. {  
  52.     public static void main(String []args)  
  53.     {  
  54.         Tick t = new Tick();  
  55.   
  56.         Thread t1 = new Thread(t);  
  57.         Thread t2 = new Thread(t);  
  58.         Thread t3 = new Thread(t);  
  59.         Thread t4 = new Thread(t);  
  60.   
  61.         t1.start();  
  62.         t2.start();  
  63.         t3.start();  
  64.         t4.start();  
  65.   
  66.     }  
  67. }  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值