多线程专栏------多线程的实现方式(二)

目录


1、继承Thread类

优点: 编码简单
缺点: 无法继承其他类了,不利于扩展
资源共享: 不能资源共享

1.1 实现步骤

1、定义Thread类的子类,重写run方法;

2、创建Thread子类的实例;

3、调用该实例的start方法启动线程。

1.2 代码演示

java 复制代码
public class Thread_01 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("工作线程---" + i + "----" + Thread.currentThread().getName());
        }
    }
}
// 创建Thread_02 线程
public class Thread_02 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("听歌线程---"+i+"----"+Thread.currentThread().getName());
        }
    }
}

//测试
public static void main(String[] args) {
        //创建线程对象
        Thread_01 thread_01 = new Thread_01();
        Thread_02 thread_02 = new Thread_02();
        //启动线程
        thread_01.start();
        thread_02.start();
    }
//测试结果
听歌线程---0----Thread-1
工作线程---0----Thread-0
听歌线程---1----Thread-1
工作线程---1----Thread-0
听歌线程---2----Thread-1
工作线程---2----Thread-0

2、实现Runnable接口

优点: 线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强
缺点: 编程多一层对象包装,如果线程有执行结果不可以直接返回
资源共享: 能资源共享

2.1 实现步骤

1、定义类实现Runnable接口;

2、重写run()方法;

3、main方法中实例化Runnable接口的实现类对象;

4、定义两个线程Thread类的对象,把Runnable接口的实现对象传入构造方法中;

5、线程类对象调用start方法,启动线程,自动执行。

2.2 代码演示

java 复制代码
public class RunnableTest1 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("听歌线程---"+i+"----"+Thread.currentThread().getName());
        }
    }
}
public class RunnableTest2 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("工作线程---"+i+"----"+Thread.currentThread().getName());
        }
    }
}
//测试
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        RunnableTest1 runnableTest1 = new RunnableTest1();
        RunnableTest2 runnableTest2 = new RunnableTest2();
        //创建线程对象,通过线程对象来开启我们的线程,代理
        new Thread(runnableTest1).start();
        new Thread(runnableTest2).start();
    }
//测试结果
工作线程---0----Thread-1
听歌线程---0----Thread-0
听歌线程---1----Thread-0
听歌线程---2----Thread-0
工作线程---1----Thread-1
工作线程---2----Thread-1

3、实现Callable接口

优点: 线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强,在这种方式下,多个线程可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
缺点: 编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread() 方法。
资源共享: 能资源共享,适用于异步编程。

3.1 实现步骤

1、定义Callable接口的实现类,并重写call方法;

2、创建Callable实现类的对象,使用FutureTask包装该对象,并以此为target创建线程对象;

3、调用线程对象的start方法启动该线程对象;

4、通过FutureTask包装对象获取返回值。

3.2 代码演示

java 复制代码
public class CallableTest1 implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int num = new Random().nextInt(100);
        System.out.println("工作线程---"+Thread.currentThread().getName()+"  随机数:"+num);
        return num;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.创建Callable的实现内对象
        CallableTest1 callableTest1 = new CallableTest1();
        //2.使用FutureTask接收Callable对象
        FutureTask<Integer> futureTask = new FutureTask<>(callableTest1);
        //3.创建线程,并开启线程
        new Thread(futureTask).start();
        //4.获取Callable返回值 futureTask.get()
        Integer integer = futureTask.get();
        System.out.println("integer = " + integer);
    }
}
//测试结果
工作线程---Thread-0  随机数:52
integer = 52
相关推荐
leikooo3 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz4 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主5 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐5 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合6 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI6 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记6 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI6 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰7 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
青山木8 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划