JAVA多线程:什么时候使用哪种实现方式 java多线程两种方式何时使用
程序员文章站
2024-03-25 19:07:58
...
众所周知,JAVA里实现多线程有两种方式。
一是继承Thread,覆盖run()方法:
二是实现Runnable接口,实现run()方法:
这两种都是常用方法,那么问题来了,我们什么时候用哪种方式?sun公司当初为什么会设计两种实现方式?
很明显,我们在使用继承Thread方式时,有一个很大的缺点,就是我们继承了Thread后就不能继承其他类了。但是如果我们实现Runnable的话,恰好可以解决这个问题。
实际上,我们的Thread类里面有这么一段代码:
这是Thread类里面的run()方法,如果target(即Runnable对象)非空的话,它会直接调用Runnable的run()方法。
而Thread()类的run()方法是实现Runnable接口的:
publicclass Thread implements Runnable {
所以无论是哪种实现方式的run()其实都是一样的,但是Runnable方式有很明显的优势,就是它可以继承别的类而非局限于Thread类,Runnable方式说白了就是弥补这个缺陷而设计出来的。所以具体使用哪种方法就根据你实际情况了。
最后介绍个学习网站:http://gz.itcast.cn/
一是继承Thread,覆盖run()方法:
public class ThreadTest { public static void main(String[] args) { new MyThread().start(); } } class MyThread extends Thread { @Override public void run() { System.out.println("Thread.run()"); super.run(); } }
二是实现Runnable接口,实现run()方法:
public class ThreadTest { public static void main(String[] args) { new Thread(new MyRunnable()).start(); } } class MyRunnable implements Runnable { @Override public void run() { System.out.println("Runnable.run()"); } }
这两种都是常用方法,那么问题来了,我们什么时候用哪种方式?sun公司当初为什么会设计两种实现方式?
很明显,我们在使用继承Thread方式时,有一个很大的缺点,就是我们继承了Thread后就不能继承其他类了。但是如果我们实现Runnable的话,恰好可以解决这个问题。
实际上,我们的Thread类里面有这么一段代码:
/* What will be run. */ private Runnable target; public void run() { if (target != null) { target.run(); } }
这是Thread类里面的run()方法,如果target(即Runnable对象)非空的话,它会直接调用Runnable的run()方法。
而Thread()类的run()方法是实现Runnable接口的:
publicclass Thread implements Runnable {
所以无论是哪种实现方式的run()其实都是一样的,但是Runnable方式有很明显的优势,就是它可以继承别的类而非局限于Thread类,Runnable方式说白了就是弥补这个缺陷而设计出来的。所以具体使用哪种方法就根据你实际情况了。
最后介绍个学习网站:http://gz.itcast.cn/