Java 创建线程的三种方式总结
我们在开发中,为了提高程序的运行效率,经常会使用多线程的方式来实现并发操作。
那么创建线程有几种方式呢?
1、继承 Thread 类
直接继承 Thread 即可实现多线程。Thread 本质上也是实现了 Runnable 接口,线程启动的唯一方法是通过 Thread 类的 start() 实例方法实现的。start() 方法调用时,系统才会真正创建一个新线程,并执行 run() 方法,它是一个native方法。
class MyThread extends Thread { @Override public void run() { super.run(); } } private void testThread(){ Thread thread = new MyThread(); thread.start(); }
这种方式的缺点就是,Java 的单继承限制,想通过 Thread 实现多线程,就只能继承 Thread 类,不可继承其他类。
2、实现 Runnable 接口
如果自己的类已经继承了其他类,这时就只能通过实现 Runnable 接口来实现多线程了。
不过,继承 Runnable 接口后,想要启动线程,需要把该类的对象作为参数,传递给 Thread 的构造函数,并使用 Thread 类的实例方法 start 来启动。
public class TestThread extends A implements Runnable { public void run() { …… } } //启动线程 TestThread testThread = new TestThread(); Thread thread = new Thread(testThread); thread.start();
Thread 内部的 run 方法我们可以看到它的实现原理:
private Runnable target; public void run() { if (target != null) { target.run(); } }
target 是我们传递进来的 Runnable 对象,当线程执行时,线程的 run 方法会直接调用 Runnable 对象的 run 方法。
3. 实现 Callable 接口
如果想要执行的线程有返回,怎么处理呢?这时应该使用 Callable 接口了,与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。
public class MyCallable implements Callable
{ public Integer call() { return 111; } } public static void main(String[] args) throws ExecutionException, InterruptedException { MyCallable mc = new MyCallable(); FutureTask
ft = new FutureTask<>(mc); Thread thread = new Thread(ft); thread.start(); System.out.println(ft.get()); }
比较
这几种线程创建方式中,实现接口会更好一些,因为:
- Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口。
- 类可能只要求可执行就行,继承整个 Thread 类开销过大。
- 另外,如果需要有返回值时,使用 Callable 接口是适合的。
总结
本节我们回顾了,Java中创建线程的几种方式。
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口
PS:更多精彩内容,请查看 –> 《Java 技术点合集》
PS:更多精彩内容,请查看 –> 《Java 技术点合集》
PS:更多精彩内容,请查看 –> 《Java 技术点合集》
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176391.html原文链接:https://javaforall.net
