【JavaEE】—— 创建线程的三种方式(Thread、Runnable、Callable)

目录

一、继承Thread类(不推荐使用)

具体操作:

注意事项

二、实现Runnable接口(常用)

具体操作:

三、实现Callable接口(常用)

具体操作:


一、继承Thread类(不推荐使用)

继承Thread类,重写Run方法

具体操作:

  1. 定义一个子类MyThread继承线程类Thread,重写run()方法
  2. 创建MyThread类对象
  3. 调用线程对象的start()方法启动线程
java 复制代码
public class Test {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start();
    }
}

class MyThread extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

**优点:**编程简单

**缺点:**1、耦合度高,线程任务与线程对象绑定,一个线程任务只能由一个线程对象执行。

2、由于Java单继承特性,只能继承一个类,不能再继承其他类。

注意事项

1、启动线程调用的是start方法,而不是run方法

直接调用run方法会当成普通方法执行,相当于还是单线程

2、不要把主线程任务放在启动子线程之前

这样主线程会先结束,相当于单线程的效果

二、实现Runnable接口(常用)

实现Runnable接口,重写run()方法

具体操作:

  1. 定义一个线程任务类MyRunnable,实现Runnable接口,重写run()方法
  2. 创建MyRunnable任务对象
  3. 把MyRunnable任务对象交给Thread处理
java 复制代码
public class Test2 {
    public static void main(String[] args) {
        //方式一
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        //方式二:简化使用
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        }).start();
    }
}
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

**优点:**1、相同的任务可以由不同的线程执行,代码复用性提高。

2、更灵活,可以继承其他类

**缺点:**相比与继承Thread类,需要多创建Runnable线程任务对象

三、实现Callable接口(常用)

前两种创建方式都存在一个问题:不能返回执行结果!

具体操作:

  1. 定义一个类MyCallable实现Callable接口,重写call方法
  2. 创建MyCallable对象,封装成FutureTask
  3. 把线程任务对象交给Thread对象,调用start方法启动
  4. 线程执行完毕后,通过FutureTask对象的get方法获取执行结果
java 复制代码
public class Test3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //方式一
        MyCallable callable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println(futureTask.get());
    }
}
class MyCallable implements Callable {
    @Override
    public Object call() throws Exception {
        return Thread.currentThread().getName();
    }
}
相关推荐
Mr_pyx8 分钟前
Spring AI 入门教程:Java开发者的AI应用捷径
java·人工智能·spring
Le_ee26 分钟前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
Zephyr_040 分钟前
Leedcode算法题
java·算法
苍煜1 小时前
Java开发IO零基础吃透:BIO、NIO、同步异步、阻塞非阻塞
java·python·nio
yong99901 小时前
MATLAB读取高光谱图像
开发语言·matlab
2zcode1 小时前
基于MATLAB的肝病风险评估与分期分析系统设计与实现
开发语言·matlab
小小de风呀1 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
ooseabiscuit2 小时前
Laravel6.x核心优化与特性全解析
android·开发语言·javascript
折哥的程序人生 · 物流技术专研2 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
AllData公司负责人2 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql