黑马程序员技术交流社区

标题: 新人求助。。。 [打印本页]

作者: date1130    时间: 2014-10-13 20:40
标题: 新人求助。。。
  1. class RDemo implements Runnable
  2. {
  3. public void run()
  4. {
  5.   for(int x=0; x<101; x++)
  6.   System.out.println(Thread.currentThread().getName()+"火车票座位号:"+x);
  7. }
  8. }
  9. public class RunnableDemo
  10. {
  11. public static void main(String[] args)
  12. {
  13.   RDemo r = new RDemo();
  14.   new Thread(r).start();
  15.   new Thread(r).start();
  16. }
  17. }
  18. <p> </p>
复制代码
在毕老师的视频中讲到多线程,请问以上代码如何修改,可以多线程实现100张售票系统呢?在new的时候,每创建一个多线程,就会产生100张票,如何创建多线程共享一个数据呢?(即,多线程只售100张票),自己写的时候,不会写了,毕老师的视频中不知道是我看的不详细,还是?至今没有找到答案。


作者: Quasimodo    时间: 2014-10-13 21:10
本帖最后由 Quasimodo 于 2014-10-13 21:35 编辑

你注意看毕老师的视频里面就知道了,把被共同操作的数放成员变量就可以,一定要这么做的话可以把上面那部分代码这样写:
  1. class RDemo implements Runnable
  2. {
  3.         private int x=100;
  4.         public void run()
  5.         {
  6.         while (true)
  7.         {
  8.                 if(x>0)
  9.                 {
  10.                         System.out.println(Thread.currentThread().getName()+"火车票座位号:"+x--);
  11.                 }
  12.                 else
  13.                         break;
  14.                 }
  15.         }
  16. }
复制代码


往后还要加同步进去的
作者: date1130    时间: 2014-10-13 21:28
Quasimodo 发表于 2014-10-13 21:10
你注意看毕老师的视频里面就知道了,把被共同操作的数静态就可以,一定要这么做的话可以把上面那部分代码这 ...

非常感谢。。。
作者: Quasimodo    时间: 2014-10-13 21:36
date1130 发表于 2014-10-13 21:28
非常感谢。。。

不好意思,我说错了,不是静态,是放成员变量
作者: qq8921310    时间: 2014-10-13 21:37
接着往后面看就知道了。两个方法。
作者: date1130    时间: 2014-10-14 07:54
Quasimodo 发表于 2014-10-13 21:36
不好意思,我说错了,不是静态,是放成员变量

请问。。为什么非要成员变量才可以,不可以是局部变量吗?在if里面,换成for循环不可以吗?
作者: Quasimodo    时间: 2014-10-14 08:40
date1130 发表于 2014-10-14 07:54
请问。。为什么非要成员变量才可以,不可以是局部变量吗?在if里面,换成for循环不可以吗? ...

既然是共同操作的数,当然不就能定义在局部,局部变量只能在局部使用。如果定义在局部,
你new一个Thread的对象,用start方法,他就去调用r的run方法,那他就有了局部变量x。
你再new一个Thread的对象,他就又去调用r的run方法,那这个对象就也有个局部变量x.
跑起的时候,你使用你的x,我使用我的x,当然就不能说是共同操作了一个x了
作者: EDDY_Liang    时间: 2014-10-14 11:25
本帖最后由 EDDY_Liang 于 2014-10-14 11:31 编辑

想要操作共享数据的话我知道的有两种。。一种时在类中之间把里面成员变量加上static 静态修饰。。这样这个变量就是存在于静态区中而不是在每个对象中了。。。你创建几个对象这个变量都只有共同的一个。
第二种。。把这个变量作为一个一个对象。。而这个对象中可以只有这个变量其他什么都没用。。然后把这个对象当作参数传入2两个线程中。。。因为操作的都是一个对象中的数据。。所以里面的数据就是共享数据。。但你同时要在线程的那个类里面创建这个对象类型的成员变量通过带有这个对象参数的构造函数对其进行初始化。
比如:
class Source{
     int ticket = 100;

class Demo{
      private Source;      Demo( Source    s){
       this.Source = s;
        }
     void run(){
       System.out.println(Source.ticket--);
     }

Source s = new Source();
Demo d1 = new Demo(s);
Demo d2 = new Demo(s);
new thread(d1).start();
new thread(d2).start();


写了那么多希望你能懂,你可以把我的代码运行一下,这样可以看的更清楚





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2