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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jk7130866 中级黑马   /  2015-7-25 21:09  /  231 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有两种手段,一种是继承Thread类,另外一种是实现Runable接口。
先来说说继承Thread类的方法:首先建个java工程,创建一个测试类ThreadDenmo ,然后建一个内部类MyThread 类继承自Thread,重写 run()方法,想让子线程什么工作就写在run()方法中,注意一点super.run()就不要了,不然还会调用Thread.run().我在这里犯了一个错误就是这个内部类要被main方法用到所以需要是静态的,忘了关键字static。大家别忘了啊!我在MyThread 类定义了一个成员变量来获取当前进程id,以区分不同进程

public class ThreadDenmo {

       

        static  class Mythread extends Thread{//继承Tread并覆盖run()方法加入自己的逻辑

                long id=getId();

                @Override

                public void run() {//这里就简单的执行了一个打印的逻辑

                        for(int i=0;i<10;i++){       

                        System.out.println(i+"    "+"id:"+"    "+id);       

                        }

                }

        }

       


        public static void main(String[] args) {

                // TODO Auto-generated method stub

             new Mythread().start() ;//创建一个线程并启动

                new Mythread().start() ;


        }


现在看看运行结果:

0    id:    8

0    id:    9

1    id:    8

1    id:    9

2    id:    8

2    id:    9

3    id:    8

3    id:    9

4    id:    8

4    id:    9

5    id:    8

5    id:    9

6    id:    8

呵呵:和预想的一样new出来的两个进程都运行起来了,先不急着换另一个方法,我想试试Thead的另一个方法,不用从父类继承来的start启动,调用自己复写run运行看看是什么结果

0    id:    8

1    id:    8

2    id:    8

3    id:    8

4    id:    8

5    id:    8

6    id:    8

7    id:    8

8    id:    8

9    id:    8

0    id:    9

1    id:    9

2    id:    9

3    id:    9

4    id:    9

5    id:    9

结果大家看到了的到了顺序的结果,可见线程没有启动,只是调用了自己的实例run方法而已,和普通方法调用没有区别,所以别忘了启动线程的是父类start方法。

现在来看看另外一种方法:实现Runable接口。
我在这段代码的基础上改动一下
public class ThreadDenmo {

static  class Mythread implements Runnable{//实现
Runnable接口


@Override
public void run() {//重写
run()方法加入自己的逻辑
for(int i=0;i<10;i++){
System.out.println(i+"    "+"id:");
}
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub

new Thread(new Mythread()).start();
new Thread(new Mythread()).start();
}
  

}让Mythread()实现Runable接口,在主方法中new两个Thread对象,传入Mythread()对象,调用start方法,线程运行起来了。
这两中方法有什么区别呢,Mythread()实现Runable接口可以传给了多个线程同一个对象,也就是说多个线程可共享这个对象,而继承的方法就不行了,虽然可以使用静态共享属性,但是静态的属性生命周期太长不推荐使用。而且使用继承的方式耦合性有点高,也有一些程序员认为如果不是扩展类的功能的话,不应该使用继承。实现Runable接口解决了类不能多继承的弊端,比如学生类继承自人这个类,它就不能在继承Thread这个类了,实现接口的话就可以再在子线程执行自己的代码了。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马