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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Shimano 中级黑马   /  2014-5-4 15:46  /  1409 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Ticket implements Runnable
  2. {
  3.         private int tick = 100;
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         if(tick>0)
  9.                         {
  10.                                 try{Thread.sleep(10);}catch(Exception e){};
  11.                                 System.out.println(Thread.currentThread().getName()+"sale: "+tick--);
  12.                         }
  13.                 }
  14.         }
  15. }

  16. class TicketDemo1
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Ticket t = new Ticket();
  21.                
  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. }
复制代码
上边是创建线程的第二种方式:实现Runnable接口
我有以下两个疑问:
        1.虽然通过查API文档,Thread类有一个这样的构造方法
        public Thread(Runnable target)
        {
                //分配新的 Thread 对象
                //参数:target - 其 run 方法被调用的对象。
        }
                Ticket t = new Ticket();
               
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                Thread t3 = new Thread(t);
                Thread t4 = new Thread(t);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
                上边这些代码,具体是一个什么过程,不清楚....
       
        2.如果上边Ticket类中的的run方法改写为:
        public void run()
        {
                if(tick>0)
                {
                        try{Thread.sleep(10);}catch(Exception e){};
                        System.out.println(Thread.currentThread().getName()+"sale: "+tick--);
                }
        }
        为什么只能打印出四张票,加上while(true){}就能一直打印?过程是怎样的...

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

5 个回复

倒序浏览
if 是判断 , while 才是循环。
四个线程每一条判断一次就打印了,线程结束。
回复 使用道具 举报
run里面 一般用while  for,只有循环才能不断执行!
还有个方法就是写在线程池里面!
回复 使用道具 举报
第一个问题:
Runnable是Thread的一个子类,您的这个代码是通过重写Runnable中的run方法,最后通过调用来进行开启线程的,重写方法后,之后如果要调用Thread中开启线程的方法,就必须建立Thread类对象,并传入Runnable子类对象,此对象就为t,之后再通过建立的Thread对象t1,t2,t3开启线程
第二个问题:
while(true){

}是方法中表示无限循环的一种固定格式,加上这个方法后,大括号中的方法就会无限循环
而您写的if语句属于判断语句,不属于循环,如果满足判断条件就执行一次,如果不满足,就不执行了,所以不能继续循环的
我也是最近刚学到,希望对您有所帮助
回复 使用道具 举报
赵京 发表于 2014-5-4 17:19
第一个问题:
Runnable是Thread的一个子类,您的这个代码是通过重写Runnable中的run方法,最后通过调用来进 ...

public class Thread extends Object implements Runnable{}

恩,Thread是实现Runnable接口的类吧....

回复 使用道具 举报
本帖最后由 赵京 于 2014-5-4 17:53 编辑
Shimano 发表于 2014-5-4 17:37
public class Thread extends Object implements Runnable{}

恩,Thread是实现Runnable接口的类吧....

恩,是的,我刚才写的不够严谨,就是因为Runnable不是Thread的子类,所以就不能直接调用Thread方法,我们就需要调用Thread(Runnable target)方法;需要建立一个Thread 对象,并将Runnable子类对象传入,之后再通过Thread对象调用start();方法。之前的说法希望没有误导你,不好意思啊,哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马