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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-9-5 18:19  /  2290 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一种:
class Ticket extends Thread
{
private int tick=100;
public void run()
{
  while(true)
  {
    if(tick>0)
    {
     System.out.println("执行");
     System.out.println(Thread.currentThread().getName()+"::"+tick--);
    }
  }
}
}
class TicketDemo3
{
public static void main(String[] args)
{
  Ticket t1=new Ticket();
  Ticket t2=new Ticket();
  Ticket t3=new Ticket();
  Ticket t4=new Ticket();
  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}

第二种:
class Ticket extends Thread
{
private int tick=100;
public void run()
{
  while(true)
  {
    if(tick>0)
    {
     System.out.println("执行");
     System.out.println(Thread.currentThread().getName()+"::"+tick--);
    }
  }
}
}
class TicketDemo
{
public static void main(String[] args)
{
  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();
}
}

第三种:
class Ticket implements Runnable
{
private int tick=1000;
Object obj=new Object();
public void run()
{
  while(true)
  {
   synchronized(obj)
   {
    if(tick>0)
    {
     try
     {
      Thread.sleep(10);
     }
     catch (Exception e)
     {
      System.out.println("执行");
     }
     System.out.println(Thread.currentThread().getName()+tick--);
    }
   }
  }
}
}
class TicketDemo2
{
public static void main(String[] args)
{
  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();
}
}

创建多线程有两种方法:继承Thread类和实现Runnable接口
继承的步骤:
1.继承Thread类
2.复写Thread中的方法
3.调用新城的start方法
实现的步骤:
1.定义类,实现Runnable接口
2.覆盖Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

上面的第一种是继承Thread类,第三种是实现Runnable接口的方法,
但是第二种方法是属于什么?红色部分是属于实现的代码怎么也能用?
请详解一下它们的区别?谢谢

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
第二种方法你是利用继承Thread,Thread实际上也实现了Runnable,这样的话你的Ticket也就是一个Runnable,就可以传入Thread构造函数里
回复 使用道具 举报
第一种方法和第二种方法都继承了Thread方法。
因为JDK API中Thread类已经声明了public class Threadextends Objectimplements Runnable,
实现了Runnable这个接口,所以第二种方法中的红色代码也能够使用。

第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。

第三种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。

第二种方法使用红色代码部分也能够执行,但是却把Ticket t=new Ticket();Thread t1=new Thread(t);
  看作成了实现了Runnable接口的类。
回复 使用道具 举报
第一种继承Thread类相当于,我要生产一个产品,首先我要建一个那个符合标准的工厂来生产产品,第三种实现Runnable接口的,相当于我要生产一个产品我就要建一个那样的工厂太麻烦了,我可以准备符合标准的(Runnable接口)的原材料,我找相应的代工厂(Thread)去帮我生产,至于第二种相当于,你先让那个工厂生产出来半成品,再把半成品继续交给这个工厂帮你生产,多余了。所以只有两种,继承Thread类,实现runnable,区别就相当于一个人只能有一个亲爹,但可以认很多干爹是一个道理的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马