黑马程序员技术交流社区

标题: 多线程—Runnable接口创建方法疑惑 [打印本页]

作者: 夏夜猫    时间: 2013-9-2 00:33
标题: 多线程—Runnable接口创建方法疑惑
本帖最后由 夏夜猫 于 2013-9-2 22:23 编辑

Runnable接口创建方法如下:
1.定义一个类实现Runnable接口;
2.重新run方法;
3.建立Thread对象,在构造方法中,传递Runnable接口的实现类对象Thread(Runnable target);
4.调用Thread对象中的start方法,启动线程。

如下图,是老师上课时创建的一个实例(4个窗口出售100张火车票):

  1. <P>
  2. <P>
  3. class Ticket implements Runnable{
  4.      private int tickets = 100;
  5.      private Object obj = new Object();
  6.      public void run(){
  7.           while(true){
  8.                synchronized(obj){
  9.                     if(tickets > 0){
  10.                         try{
  11.                               Thread.sleep(5);
  12.                          }catch(Exception e){}
  13.                     System.out.println(Thread.currentThread().getName()+"出售第"+tickets--+"张");
  14.                     }
  15.                }
  16.           }
  17.      }
  18. }

  19. class  ThreadDemo1{
  20.       public static void main(String[] args) {</P>
  21. <P>           Ticket t = new Ticket();
  22.            Thread t1 = new Thread(t);
  23.            Thread t2 = new Thread(t);
  24.            Thread t3 = new Thread(t);
  25.            Thread t4 = new Thread(t);
  26.            t1.start();
  27.            t2.start();
  28.            t3.start();
  29.            t4.start();
  30.       }
  31. }</P>
复制代码
第三步红色字部分比较难懂,主要疑问有:

Thread对象如何被创建?(因为只有Object是所有类的主类,可以被直接引用才对啊)就如上题中第一个类中的打印语句Thread.currentThread().getName()是如何被调用的?

我个人觉得是和写在JDK里面的这句话"类 Thread 已实现的接口:Runnable"有关,但不知如何理解。

另外,关于currentThread()方法,具体有什么作用?

作者: Nero    时间: 2013-9-2 01:30
Thread.currentThread().getName()
意为:得到当前线程对象的名称!
通过Runnable实现的线程需要new一个对象,吧这个对象传到Thread对象中去,与之关联。
作者: gulup    时间: 2013-9-2 01:35
本帖最后由 gulup 于 2013-9-2 04:16 编辑

楼主,又是我,我又在深夜来赚技术分了,你也老是深夜来问问题,我俩、们挺有缘哈。
现在来回答你的问题。

1:Thread对象如何被创建?(因为只有Object是所有类的主类,可以被直接引用才对啊)就如上题中第一个类中的打印语句Thread.currentThread().getName()是如何被调用的?
首先批评下楼主,什么叫做只有Object类才可以被直接引用呢,楼主都学到多线程了,前面的基础白学了?只要不是抽象类和接口,就可以直接创建实例化对象。对了。还有枚举。
Thread对象如何被创建?你的代码里面不是都有了吗?
  1. Thread t1 = new Thread(t);
  2. Thread t2 = new Thread(t);
  3. Thread t3 = new Thread(t);
  4. Thread t4 = new Thread(t);
复制代码
这里面不就创建了4个Thread类的实例化对象了?
第一个类中的打印语句Thread.currentThread().getName()是如何被调用的?
这就更加需要批评楼主了,类名.方法名()。这样的方式调用方法,不就是静态方法吗,楼主请看API

currentThread是静态方法啊,通过类名.方法名()就可以调用了啊。。。该方法返回来的是当前只在执行的线程对象,既然是线程对象,那么就可以调用线程对象的方法咯。再看API:

getName()不就返回来线程名称咯。
看到这里,相信楼主的第一个问题已经解决了吧。。。


2:我个人觉得是和写在JDK里面的这句话"类 Thread 已实现的接口:Runnable"有关,但不知如何理解。
没什么关系的。。。就是字面意思,Thread类就是实现了Runnable接口的。为嘛Thread类要实现Runnable接口呢?因为Runnable接口只是提供了一个公共的协议,需要进行线程操作的,都需要实现这个协议,就如线程类也不例外,所以Thread类就实现了Runnable接口。

另外,关于currentThread()方法,具体有什么作用?
上面的API截图写了。就是获取当前正在执行的线程对象。比如你在main方法中写Thread.currentThread()的话,就是返回执行main方法的线程对象,我们叫做“主线程”。
以上,完毕
作者: 夏夜猫    时间: 2013-9-2 22:23
gulup 发表于 2013-9-2 01:35
楼主,又是我,我又在深夜来赚技术分了,你也老是深夜来问问题,我俩、们挺有缘哈。
现在来回答你的问题。
...

批的对。。。零基础上课确实有这样的感觉,每天上的都是新内容,尝尝做题时忘了前面说过的某点东西,然后卡半天- -
找时间还是需要经常看看前面的内容,巩固下。
谢谢解决问题,夜猫子知心人- -

作者: 夏夜猫    时间: 2013-9-2 22:57
gulup 发表于 2013-9-2 01:35
楼主,又是我,我又在深夜来赚技术分了,你也老是深夜来问问题,我俩、们挺有缘哈。
现在来回答你的问题。
...

刚刚又思索了一下,其实我的问题是我没想明白为什么可以直接创建Thread的对象,因为我并没有在源代码里面写Thread类啊,然后突然想起来了,这个Thread是和int一样,都是JAVA JDK里面早就写好了的东西,我可以int a; ,自然可以Thread t1;了 ,有点犯二。。。




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