A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王春蕾 中级黑马   /  2014-4-14 20:30  /  597 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 创建线程的第二种方式
  3. 1、实现Runnable接口
  4. 2、覆盖run方法
  5. 3、通过Thread类创建线程对象
  6. 4、将Runnable接口的子类对象作为实参传递给Thread类中的构造函数
  7. 5、调用start方法开启线程,并运行Runnable接口的run方法

  8. 第二种实现Runnable接口创建线程的思想:
  9. 将线程任务和线程对象进行解耦,将线程任务单独封装成对象。

  10. 另外,实现Runnable接口可以避免单继承的局限性。
  11. 所以建议创建多线程时实现Runnable接口的方式。
  12. */

  13. /*
  14. 线程安全问题:
  15. 原因:
  16.         1、多个线程在同时处理共享数据
  17.         2、线程任务中有多条代码在操作共享数据
  18. 安全问题的成因就是:
  19.         一个线程在通过多条操作共享数据的过程中,其它线程也参与了
  20.         共享数据的操作,导致了数据的错误。

  21. 想要知道你的多线程程序有没有安全问题:
  22.         只要看线程任务中是否有多条代码在处理共享数据。

  23. 解决多线程安全问题的方法:
  24.         一个线程在通过多条语句操作共享数据的过程中,不允许其它
  25.         线程参与运算

  26. 如何用代码体现?
  27.         Java中提供了同步代码块进行引起安全问题的代码封装
  28.         格式:
  29.                 synchornized(对象)
  30.                 {
  31.                         需要被同步的代码
  32.                 }
  33. 同步的优缺点:
  34.         好处:解决了多线程的安全问题
  35.         弊端:降低了效率

  36. 同步的前提:
  37.         1、至少有两个线程在同步中。
  38.         2、必须保证同步使用的是同一个锁

  39. 同步函数和同步代码块的区别
  40.         1、同步函数使用的是固定锁this。
  41.         2、同步代码块使用的锁是可以指定的。

  42. 静态同步函数使用的锁是什么?
  43.         就是所在类的类名.class字节码文件对象。

  44. */

  45. class ThreadDemoSolve
  46. {
  47.         public static void main(String[] args)
  48.         {
  49.                 Ticket t1=new Ticket();
  50.                 new Thread(t1).start();
  51.                 new Thread(t1).start();
  52.                 new Thread(t1).start();
  53.                 new Thread(t1).start();
  54.                 //System.out.println("Hello World!");
  55.         }
  56. }
  57. class Ticket implements Runnable
  58. {
  59.         private static  int num=100;
  60.         Object obj=new Object();
  61.         /*
  62.         同步的第二种表现形式
  63.         同步函数
  64.         */
  65.         public static synchronized void sale()
  66.         {
  67.                         if(num>0)
  68.                                 {
  69.                                 /*让线程小睡一会,如果此时CPU切换到其它程序的执行权
  70.                                  就会让线程暂时“困”在这里,此时如果有其它线程进入,
  71.                                  也有可能会出现被困现象,待CPU切换到该线程的执行权时,
  72.                                  num的值已经改变,此时运行结果就很有可能出现“灵异”现象                               
  73.                                 */
  74.                                 try{Thread.sleep(20);}
  75.                                 catch(InterruptedException e )
  76.                                 {
  77.                                         System.out.println(e);
  78.                                 }                               
  79.                                 System.out.println(Thread.currentThread().getName()+"Sale:"+num--+"this...");
  80.                                 }
  81.                                
  82.         }
  83.         public void run()
  84.         {
  85.                 while(true)
  86.                 {
  87.                         //synchronized(obj)
  88.                         //{
  89.                                 this.sale();
  90.                                 if(num<=0)
  91.                                 {
  92.                                 //Thread.currentThread().stop();
  93.                                         return;
  94.                                 }
  95.                         //}
  96.                 }
  97.         }
  98. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马