区别:
一、创建线程的方式不同:
1 、 实现Runnable接口是使用代理模式,交给Thread()类去start启动线程;
如:new Thread(new MyRunnable(),"线程名").start();
2、一个类继承Thread类以后本身就是一个线程对象,可以直接使用start启动;
如:new MyThread().satrt();
二、设置线程名方式不同
1、实现Runnable接口可以在创建线程时Thread类的构造器内设置线程名;
如:new Thread(new MyRunnable(),"线程名").start();
2、继承Thread类,可以调用super()父类构造器起名;
class MyThread extends Thread{
public MyThread (String name){
supper(name);
}
}
new MyThread ("a").start();
new MyThread ("b").start();
new MyThread ("c").start();
三、获取线程名方式不同:
1、实现Runnable接口获取线程名方式:
Thread.currentThread().getName();
2、继承Thread类本身就是线程,获取线程名方式两种都可以:
Thread.currentThread().getName();
this.getName();
由于Java是单继承,一个类继承Thread类以后不能继承其他类,扩展性不好;
而实现Runnable接口还可以实现其它接口,解决了java单继承问题;
四、是否能实现变量资源共享
继承Thread类不能实现线程变量资源共享(注意,是线程里的变量);
(原因: 每次创建的都是一个新的线程;)
public class TestThread{
public static void main(String[] args){
//因为每次都创建一个新的线程对象,
//所以 继承Thread类不能实现线程变量共享;
new MyThread(“a”).start();
new MyThread(“b”).start();
new MyThread(“c”).start();
}
}
class MyThread extends Thread{
int count = 10;
}
实现Runnable 接口线程变量是可以共享的,也可以不共享,看创建线程的方式
public class TestRunnable{
public static void main(String[] args){
//这样可以实现线程变量共享
MyRunnable myRunnable = new MyRunnable();
new Thread( myRunnable ,"a" ).start();
new Thread( myRunnable ,"b" ).start();
new Thread( myRunnable ,"c" ).start();
//这样不能实现线程变量共享
//new Thread( new MyRunnable() ,"a" ).start();
// new Thread( new MyRunnable() ,"b" ).start();
//new Thread( new MyRunnable() ,"c" ).start();
}
}
class MyRunnable implements Runnable{
int count = 10;
}