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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史龙贤 黑马帝   /  2012-9-14 01:20  /  1187 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

方式一:用Thread类创建线程
classMyThreadextendsThread{
publicvoidrun(){
/*覆盖该方法*/
}
}
当使用继承创建线程,这样启动线程:
newMyThread().start();


方式二:用Runable类创建线程
声明为一个实现Runnable接口的类,并
classMyThreadimplementsRunnable{
publicvoidrun(){
/*实现该方法*
}
}

newThread(newMyThread()).start();


疑问:请问这两种创建进程的方式有什么区别呢?为什么要这样来做呢?

3 个回复

倒序浏览
Thread是需要继承的 Runnable需要实现
在java中,只支持单继承,因此如果你需要创建多线程的同时又需要继承某个父类,那么Thread就不够用了
但是在java中是支持多继承的,因此在上述情况下就可以同过继承一个父类的同时实现Runnable接口来完成多线程。

他们的区别就在于:Thread是继承;Runnable是实现
回复 使用道具 举报
Java中线程的创建有两种方式:

1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中
2.  通过实现Runnable接口,实例化Thread类

    在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。


Java代码

  • package com.threadtest;   
  • class MyThread extends Thread{   
  •       
  •     private int ticket = 10;   
  •     private String name;   
  •     public MyThread(String name){   
  •         this.name =name;   
  •     }   
  •       
  •     public void run(){   
  •         for(int i =0;i<500;i++){   
  •             if(this.ticket>0){   
  •                 System.out.println(this.name+"卖票---->"+(this.ticket--));   
  •             }   
  •         }   
  •     }   
  • }   
  • public class ThreadDemo {   
  •   
  •       
  •     public static void main(String[] args) {   
  •         MyThread mt1= new MyThread("一号窗口");   
  •         MyThread mt2= new MyThread("二号窗口");   
  •         MyThread mt3= new MyThread("三号窗口");   
  •         mt1.start();   
  •         mt2.start();   
  •         mt3.start();   
  •     }   
  •   
  • }  

package com.threadtest;class MyThread extends Thread{        private int ticket = 10;    private String name;    public MyThread(String name){        this.name =name;    }        public void run(){        for(int i =0;i<500;i++){            if(this.ticket>0){                System.out.println(this.name+"卖票---->"+(this.ticket--));            }        }    }}public class ThreadDemo {        public static void main(String[] args) {        MyThread mt1= new MyThread("一号窗口");        MyThread mt2= new MyThread("二号窗口");        MyThread mt3= new MyThread("三号窗口");        mt1.start();        mt2.start();        mt3.start();    }}

运行结果如下:

Java代码

  • 一号窗口卖票---->10  
  • 一号窗口卖票---->9  
  • 二号窗口卖票---->10  
  • 一号窗口卖票---->8  
  • 一号窗口卖票---->7  
  • 一号窗口卖票---->6  
  • 三号窗口卖票---->10  
  • 一号窗口卖票---->5  
  • 一号窗口卖票---->4  
  • 一号窗口卖票---->3  
  • 一号窗口卖票---->2  
  • 一号窗口卖票---->1  
  • 二号窗口卖票---->9  
  • 二号窗口卖票---->8  
  • 三号窗口卖票---->9  
  • 三号窗口卖票---->8  
  • 三号窗口卖票---->7  
  • 三号窗口卖票---->6  
  • 三号窗口卖票---->5  
  • 三号窗口卖票---->4  
  • 三号窗口卖票---->3  
  • 三号窗口卖票---->2  
  • 三号窗口卖票---->1  
  • 二号窗口卖票---->7  
  • 二号窗口卖票---->6  
  • 二号窗口卖票---->5  
  • 二号窗口卖票---->4  
  • 二号窗口卖票---->3  
  • 二号窗口卖票---->2  
  • 二号窗口卖票---->1  

一号窗口卖票---->10一号窗口卖票---->9二号窗口卖票---->10一号窗口卖票---->8一号窗口卖票---->7一号窗口卖票---->6三号窗口卖票---->10一号窗口卖票---->5一号窗口卖票---->4一号窗口卖票---->3一号窗口卖票---->2一号窗口卖票---->1二号窗口卖票---->9二号窗口卖票---->8三号窗口卖票---->9三号窗口卖票---->8三号窗口卖票---->7三号窗口卖票---->6三号窗口卖票---->5三号窗口卖票---->4三号窗口卖票---->3三号窗口卖票---->2三号窗口卖票---->1二号窗口卖票---->7二号窗口卖票---->6二号窗口卖票---->5二号窗口卖票---->4二号窗口卖票---->3二号窗口卖票---->2二号窗口卖票---->1
通过实现Runnable接口的代码如下:

Java代码

  • package com.threadtest;   
  • class MyThread1 implements Runnable{   
  •     private int ticket =10;   
  •     private String name;   
  •     public void run(){   
  •         for(int i =0;i<500;i++){   
  •             if(this.ticket>0){   
  •                 System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));   
  •             }   
  •         }   
  •     }   
  • }   
  • public class RunnableDemo {   
  •   
  •       
  •     public static void main(String[] args) {   
  •         // TODO Auto-generated method stub   
  •         //设计三个线程   
  •          MyThread1 mt = new MyThread1();   
  •          Thread t1 = new Thread(mt,"一号窗口");   
  •          Thread t2 = new Thread(mt,"二号窗口");   
  •          Thread t3 = new Thread(mt,"三号窗口");   
  • //         MyThread1 mt2 = new MyThread1();   
  • //         MyThread1 mt3 = new MyThread1();   
  •          t1.start();   
  •          t2.start();   
  •          t3.start();   
  •     }   
  •   
  • }  

package com.threadtest;class MyThread1 implements Runnable{    private int ticket =10;    private String name;    public void run(){        for(int i =0;i<500;i++){            if(this.ticket>0){                System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));            }        }    }}public class RunnableDemo {        public static void main(String[] args) {        // TODO Auto-generated method stub        //设计三个线程         MyThread1 mt = new MyThread1();         Thread t1 = new Thread(mt,"一号窗口");         Thread t2 = new Thread(mt,"二号窗口");         Thread t3 = new Thread(mt,"三号窗口");//         MyThread1 mt2 = new MyThread1();//         MyThread1 mt3 = new MyThread1();         t1.start();         t2.start();         t3.start();    }}
运行结果如下:
Java代码

  • 一号窗口卖票---->10  
  • 三号窗口卖票---->9  
  • 三号窗口卖票---->7  
  • 三号窗口卖票---->5  
  • 三号窗口卖票---->4  
  • 三号窗口卖票---->3  
  • 三号窗口卖票---->2  
  • 三号窗口卖票---->1  
  • 一号窗口卖票---->8  
  • 二号窗口卖票---->6  

一号窗口卖票---->10三号窗口卖票---->9三号窗口卖票---->7三号窗口卖票---->5三号窗口卖票---->4三号窗口卖票---->3三号窗口卖票---->2三号窗口卖票---->1一号窗口卖票---->8二号窗口卖票---->6

继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;
实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
      

   在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
      
   




回复 使用道具 举报
详细步骤
创建方式一:
1、定义一个类继承Thread
2、子类覆盖父类中的run方法
3、建立子类对象的同时,线程也被创建
4、通过调用start方法开启线程
创建方式二:
1、定义类实现Runnable接口
2、覆盖Runnable接口中的run方法
   (将线程要运行的代码存放在该run方法中)
3、通过Thread类 建立线程对象
4、将Runnable接口的子类对象 作为实际参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马