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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 暗夜星辰 中级黑马   /  2014-6-11 09:55  /  1091 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.多线程中采用继承Thread的方法后,run()方法中代码不能被不同对象共享,而实现Runnable接口后就能被共享?
2.同步代码块中放的是操作共享数据的语句,但是怎么才能知道这些语句是共享数据?以下代码中的问题希望各位大大能帮忙解释下,谢谢!
  1. class Ticket implements Runnable//extends Thread
  2. {
  3.         private  int num = 100;

  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 int z = 10;                //为什么这句代码不用同步?
  8.                
  9.                 while(true)                //为什么把这个while循环去掉后,结果和原来的差别很大?while循环在这里的作用是什么?
  10.                 {
  11.                        
  12.                                 if(num>0)
  13.                                 {
  14.                                        
  15.                                        
  16.                                         try{Thread.sleep(10);}catch (InterruptedException e){}
  17.                                        
  18.                                         System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
  19.                                
  20.                                 }
  21.                 }
  22.         }
  23. }


  24. class  TicketDemo
  25. {
  26.         public static void main(String[] args)
  27.         {

  28.                 Ticket t = new Ticket();//创建一个线程任务对象。

  29.                 Thread t1 = new Thread(t);
  30.                 Thread t2 = new Thread(t);
  31.                 Thread t3 = new Thread(t);
  32.                 Thread t4 = new Thread(t);

  33.                 t1.start();
  34.                 t2.start();
  35.                 t3.start();
  36.                 t4.start();
  37.        
  38.         }
  39. }
复制代码


4 个回复

倒序浏览
1.多线程中采用继承Thread的方法后,run()方法中代码不能被不同对象共享,而实现Runnable接口后就能被共享?
这个问题,我觉得是看情况定的哦。
你看嘛,如果是继承Thread的话,你开启多个线程的的方法只能是,
  1. Ticket t1=new Ticket();
  2.            Ticket t2=new Ticket();
  3.            t1.start();
  4.            t2.start();
复制代码

这样子你就开启了多个不同的对象,t1,t2,t1有自己的num,t2也有自己的num,所以这里的num不是这个几个对象共享的一个num。而如果你是实现Runnable接口的话,你启动多个线程的方法是,
      
  1. Ticket t = new Ticket();
  2.                 Thread t1 = new Thread(t);
  3.                 Thread t2 = new Thread(t);
复制代码

这里只是实例化了一个对象t,然后把t传到new Thread()中,所以t1,t2是共享一个t,也就共享一个t中的num。
如果你在这里把上面代码改为
  1.                Ticket t1 = new Ticket();
  2.                Ticket t2=new Ticket();
  3.                 Thread th1 = new Thread(t1);
  4.                 Thread th2 = new Thread(t2);
复制代码

那也是一样的共享不是同一个num。你可以放在代码中测试一下,加深理解。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
  1.                 while(true)                //为什么把这个while循环去掉后,结果和原来的差别很大?while循环在这里的作用是什么?
复制代码

线程创建是new出来一个实例。线程start()是,开启了一个线程,并且执行线程里面的run方法里面的代码。线程结束是,当run方法的代码执行完了。毕向东老师视频里面的加了while(true)只是让大家看线程不安全出现的效果的。实际程序运行时是不会自动结束的。老师想结束的时候是按快捷键强行退出的。另外后面会讲线程怎么结束。线程的结束的方法的就是run方法代码执行完,以后你可以把while括号里面的ture换成flag,在程序外面不想让线程执行的时候,就执flag标识为false。到时候学到你可以总结一下。
回复 使用道具 举报
至于共享数据。你就要理解题目的意思了。现实生活中,列车有多少个座位就有多少张票。你在A窗口可以买票,也可以在B窗口买票,AB窗口同时售票票就相当于开启AB这两个线程。而票是共享的就是A窗口买的就是这堆票,B窗口买的也是这一堆票。而你问题的z代表什么都没意义。
回复 使用道具 举报
123_yaya 发表于 2014-6-11 10:30
至于共享数据。你就要理解题目的意思了。现实生活中,列车有多少个座位就有多少张票。你在A窗口可以买票, ...

谢谢大大的讲解,很详细,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马