前言
大家都知道Java多线程开发中,实现线程有三种方式,继承Thread类,实现Runnable、Callable接口等
,下面就举例说明三种实现方式
实现代码
具体实现代码如下
package springbootdocker.demo.service;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @Author: dengcs
* @Date: 2020/7/6 21:22
* Comment:
*/
public class Test{
//第一种继承Thread
private static class TestThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("this is extendsd Thread test");
}
}
//第二种实现Runnable接口
private static class TestRunnable implements Runnable{
@Override
public void run() {
System.out.println("this is Runnable test");
}
}
//实现Callable接口,可以有返回值
private static class TestCallRunnable implements Callable<String>{
@Override
public String call() throws Exception {
return "this is Callable test";
}
}
public static void main(String[] args) {
new TestThread().start(); //第一种测试
new Thread(new TestRunnable()).start(); //第二种测试
TestCallRunnable testCallRunnable = new TestCallRunnable(); //第三种测试
FutureTask<String> futureTask =new FutureTask<>(testCallRunnable);
new Thread(futureTask).start();
try {
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public void testProc(){
new Thread().start();
}
}
测试结果
测试结果为
三种方式的优缺点
分别对三种实现方式的优缺点进行说明
-
继承Thread
优点:实现简单,只需实例化继承类的实例,即可使用线程
缺点:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法通过这种方式实现自定义线程 -
实现Runnable接口
优点:
扩展性好,可以在此基础上继承其他类,实现其他必需的功能
对于多线程共享资源的场景,具有天然的支持,适用于多线程处理一份资源的场景缺点:构造线程实例的过程相对繁琐一点
-
实现Callable接口
优点:
扩展性好
支持多线程处理同一份资源
具备返回值以及可以抛出受检查异常
缺点:
相较于实现Runnable接口的方式,较为繁琐
当然,这只是线程最简单的应用,如果用好线程,必须了解线程池及线程的几种状态,新建-》就绪-》运行-》终止, 其中还有等待和阻塞等过程。如下图
写在最后
总之,线程的应用范围非常广,用好线程其实还有很多东西要学。。
想了解更多线程知识,请继续关注我吧_