多线程的三种实现代码

简介: 多线程的三种实现代码

1.使用继承Thread类的方式实现多线程

public class MyThread extends Thread {
    public void run() {
        // 线程要执行的任务逻辑
        System.out.println("Thread is running");
    }
    public static void main(String[] args) {
        // 创建线程对象
        MyThread thread = new MyThread();
        // 启动线程
        thread.start();
    }
}

在上述代码中,我们定义了一个自定义线程类MyThread,该类继承了Thread类,并重写了Thread类的run()方法。在run()方法中编写线程要执行的任务逻辑。在main方法中,我们创建了一个MyThread对象并调用start()方法来启动线程。

当调用start()方法后,新线程将会执行run()方法中的代码逻辑。需要注意的是,在多线程编程中,不要直接调用run()方法,而是通过start()方法来启动线程,因为直接调用run()方法只会在当前线程中以普通方法的方式执行,而不会启动一个新的线程。

使用继承Thread类的方式实现多线程相对简单,但它也有一些局限性,比如无法继承其他类、代码复用性较差等。因此,在实际开发中,更推荐使用实现Runnable接口的方式来实现多线程,具有更好的灵活性和扩展性。

2.使用实现Runnable接口的方式实现多线程:

public class MyRunnable implements Runnable {
    public void run() {
        // 线程要执行的任务逻辑
        System.out.println("Thread is running");
    }
    public static void main(String[] args) {
        // 创建线程对象
        Thread thread = new Thread(new MyRunnable());
        // 启动线程
        thread.start();
    }
}

在上述代码中,我们定义了一个实现了Runnable接口的自定义类MyRunnable。该类实现了Runnable接口,并重写了run()方法,在其中编写线程的任务逻辑。在main方法中,我们创建了一个Thread对象,并将MyRunnable对象作为参数传递给Thread的构造函数。然后,调用start()方法启动线程。

使用Runnable接口的方式实现多线程具有更好的灵活性和扩展性。相比继承Thread类,使用接口的方式可以避免了单继承的限制,同时可以更方便地实现代码的复用。此外,可以通过实现Runnable接口来实现多个线程共享同一个任务实例,从而实现线程之间的数据共享和通信。

需要注意的是,在使用实现Runnable接口的方式时,线程的任务逻辑必须在run()方法中实现,而不是直接在类中编写。在启动线程时,需要将实现了Runnable接口的对象作为参数传递给Thread的构造函数,然后调用start()方法来启动线程。

3.使用Callable接口和Future接口可以实现获取线程执行结果

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<String> {
    public String call() throws Exception {
        // 线程要执行的任务逻辑
        return "Thread is running";
    }
    public static void main(String[] args) {
        // 创建Callable对象
        Callable<String> callable = new MyCallable();
        // 创建FutureTask对象
        FutureTask<String> futureTask = new FutureTask<>(callable);
        // 创建线程对象
        Thread thread = new Thread(futureTask);
        // 启动线程
        thread.start();
        try {
            // 获取线程执行结果
            String result = futureTask.get();
            System.out.println(result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们定义了一个实现了Callable接口的自定义类MyCallable。该类实现了Callable接口,并重写了call()方法,在其中编写线程的任务逻辑,并返回一个结果。

在main方法中,我们创建了一个Callable对象,并将其作为参数传递给FutureTask的构造函数来创建一个FutureTask对象。然后,我们创建一个线程对象,并将FutureTask对象作为参数传递给Thread的构造函数。最后,我们调用start()方法启动线程。

通过调用FutureTask的get()方法,我们可以获取线程的执行结果。如果线程的任务逻辑已经执行完毕,那么get()方法会立即返回结果。如果线程的任务逻辑还未完成,那么get()方法会阻塞等待,直到任务完成并返回结果。

需要注意的是,调用FutureTask的get()方法可能会抛出InterruptedException和ExecutionException异常,因此在调用get()方法时需要进行异常处理。

使用Callable接口和Future接口可以实现更灵活的线程任务,并能获取线程的执行结果,非常适用于需要线程返回结果的场景。

 


相关文章
多线程案例-定时器(附完整代码)
多线程案例-定时器(附完整代码)
404 0
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
212 3
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
839 2
|
安全 Java
Java多线程基础-10:代码案例之定时器(一)
`Timer` 是 Java 中的一个定时器类,用于在指定延迟后执行指定的任务。它常用于实现定时任务,例如在网络通信中设置超时或定期清理数据。`Timer` 的核心方法是 `schedule()`,它可以安排任务在延迟一段时间后执行。`
316 1
|
11月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
446 3
|
12月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
179 6
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
196 1
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
410 0
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
269 0

热门文章

最新文章