在我们需要实现多线程的过程中,毫无例外会用到Thread和Runnable这两个类和接口,所以,我简单的对这两个类做了一下分析,与大家分享一下
首先说说他们的共同点:
1 他们都可以实现多线程的操作,
2 他们都需要实现run方法
不同点就是他们一个是接口,而另一个是类,我们在实现多线程的时候,由于子类继承父类只能继承一个,但是可以实现多个接口,而且也可以实现资源的共享,所以我们多数采用的是实现Runnable这个接口,但是他需要创建Tread对象的start()方法来开启线程,所以说,也是各有利弊
(Thread类继承自Runnable接口)
下面,通过一段代码看看他们的不同
1Runnable 需要创建Thread对象开启线程 public class Test implements Runnable{
@Override
public void run() {
System.out.println("我是runnable线程");
}
public static void main(String[] args) {
Test t = new Test();
Thread thread = new Thread(t);
thread.start();
}
}
2Thread可以直接开启线程
public class Test extends Thread{
@Override
public void run() {
System.out.println("我是thread线程");
}
public static void main(String[] args) {
Test t = new Test();
t.start();
}
}
关于资源共享的问题
3实现Thread类
public class Test extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("我是thread线程"+i);
}
}
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
Test t3= new Test();
t1.start();
t2.start();
t3.start();
}
}
结果是(没有全部粘过来)
我是thread线程0
我是thread线程1
我是thread线程0
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
3实现Runnable接口
public class Test implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("我是thread线程"+i);
}
}
public static void main(String[] args) {
Test t =new Test();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
结果
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程0
我是thread线程1
我是thread线程2
我是thread线程3
我是thread线程4
我是thread线程5
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
我是thread线程6
我是thread线程7
我是thread线程8
我是thread线程9
显而易见的是在用Thread实现多线程的过程中,需要我们创建多个对象,但是在实现Runnable的过程中,只需要创建一个对象,由多个线程去共享其中的资源
最后,说个题外话,除了这两个方法实现多线程以外,还有一个Callable接口可以实现多线程,但是他实现的是call方法,而且他有返回值,并且可以抛出多个异常,自处理事件等许多亮点了,但是由于他的实现特别繁琐还有其它的种种原因,现在不是很常用,所以大家了解一下就可以了