黑马程序员技术交流社区

标题: 线程疑惑 [打印本页]

作者: 史龙贤    时间: 2012-9-14 01:20
标题: 线程疑惑
方式一:用Thread类创建线程
classMyThreadextendsThread{
publicvoidrun(){
/*覆盖该方法*/
}
}
当使用继承创建线程,这样启动线程:
newMyThread().start();


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

newThread(newMyThread()).start();


疑问:请问这两种创建进程的方式有什么区别呢?为什么要这样来做呢?
作者: 覃宏海    时间: 2012-9-14 01:43
Thread是需要继承的 Runnable需要实现
在java中,只支持单继承,因此如果你需要创建多线程的同时又需要继承某个父类,那么Thread就不够用了
但是在java中是支持多继承的,因此在上述情况下就可以同过继承一个父类的同时实现Runnable接口来完成多线程。

他们的区别就在于:Thread是继承;Runnable是实现
作者: 吴通    时间: 2012-9-14 05:50
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();    }}

运行结果如下:

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
通过实现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();    }}
运行结果如下:
Java代码


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

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

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





作者: 皮卫凯    时间: 2012-9-14 09:03
详细步骤
创建方式一:
1、定义一个类继承Thread
2、子类覆盖父类中的run方法
3、建立子类对象的同时,线程也被创建
4、通过调用start方法开启线程
创建方式二:
1、定义类实现Runnable接口
2、覆盖Runnable接口中的run方法
   (将线程要运行的代码存放在该run方法中)
3、通过Thread类 建立线程对象
4、将Runnable接口的子类对象 作为实际参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法




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