0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

java实现多线程的几种方式

工程师邓生 来源:未知 作者:刘芹 2024-03-14 16:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Java实现多线程的几种方式

多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序的效率和性能,使得程序可以同时处理多个任务。

Java提供了多种实现多线程的方式,本文将详细介绍以下几种方式:

1.继承Thread

2.实现Runnable接口

3.Callable和Future

4.线程池

5.Java 8中的CompletableFuture

一、继承Thread类

继承Thread类是实现多线程的最基本方式,只需创建一个类并继承Thread类,重写run()方法即可。

```java
public class MyThread extends Thread {
@Override
public void run() {
// 线程要执行的任务
System.out.println("Hello, World!");
}
}
```

然后在主程序中创建线程对象并调用start()方法启动线程。

```java
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
```

这种方式实现多线程比较简单,但是由于Java只支持单继承,所以如果已经继承了其他类就不能再继承Thread类了。

二、实现Runnable接口

实现Runnable接口是Java中另一种实现多线程的方式,也是最常用的方式。同样地,需要创建一个类并实现Runnable接口,重写run()方法。

```java
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程要执行的任务
System.out.println("Hello, World!");
}
}
```

然后在主程序中创建线程对象,并将其作为参数传递给Thread类的构造函数。

```java
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
```

使用实现Runnable接口的方式实现多线程更加灵活,因为在Java中可以实现多个接口。此外,通过将Runnable对象传递给Thread类,可以实现多个线程共享同一个Runnable对象的资源。

三、Callable和Future

Callable和Future是Java中另外一种实现多线程的方式,它可以获取线程执行结果,并且可以在任务执行过程中取消任务。

Callable接口类似于Runnable接口,不同之处在于,Callable接口的call()方法可以返回一个结果,而Runnable接口的run()方法没有返回值。

```java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MyCallable implements Callable {
@Override
public String call() throws Exception {
Thread.sleep(2000); // 模拟耗时操作
return "Hello, World!";
}
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable callable = new MyCallable();
FutureTask futureTask = new FutureTask<>(callable);

Thread thread = new Thread(futureTask);
thread.start();

String result = futureTask.get();
System.out.println(result);
}
```

这种方式使用了FutureTask类来获取线程执行结果,FutureTask是Future接口的实现类。通过调用get()方法可以获取线程的返回结果,如果线程还未执行完毕,get()方法将会阻塞等待。

四、线程池

在真实的应用程序中,创建大量的线程会消耗大量的系统资源,降低程序的性能。Java提供了线程池来管理和复用线程,从而改善性能。

使用线程池可以通过以下步骤实现多线程:

1. 创建线程池对象

2. 创建任务对象

3. 将任务提交给线程池执行

```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executorService.execute(worker);
}

executorService.shutdown();

while (!executorService.isTerminated()) {
// 等待所有任务完成
}

System.out.println("所有任务已经完成");
}
}

class WorkerThread implements Runnable {
private String message;

public WorkerThread(String message) {
this.message = message;
}

@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " (Start) message = " + message);
processMessage();
System.out.println(Thread.currentThread().getName() + " (End)");
}

private void processMessage() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```

这里通过ExecutorService类的静态方法Executors.newFixedThreadPool(5)创建一个具有5个线程的线程池。然后循环创建Runnable对象并提交给线程池执行。

最后,调用shutdown()方法关闭线程池,并等待所有任务完成。

五、Java 8中的CompletableFuture

Java 8引入了CompletableFuture类来简化异步编程和多线程开发。CompletableFuture类提供了丰富的方法来处理任务。

```java
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
// 线程要执行的任务
return "Hello, World!";
});

future.thenAccept(result -> {
System.out.println(result);
});

// 阻塞等待异步任务完成
future.join();
}
}
```

在这个例子中,CompletableFuture.supplyAsync()方法接收一个Supplier函数,返回一个CompletableFuture对象,表示异步操作的结果。然后调用thenAccept()方法来处理结果。可以继续链式调用多个方法来处理结果。

最后,调用join()方法等待异步任务完成。

总结:

Java提供了多种实现多线程的方式,每种方式都有其适用的场景。上述介绍的五种方式包含了最常见的实现多线程的方法,它们可以根据不同的需求来选择和使用。

1. 继承Thread类和实现Runnable接口是最基本、最常用的实现多线程的方式,它们相对简单,适用于简单的多线程任务。

2. Callable和Future接口适用于需要获取线程执行结果的场景,同时可以控制任务的取消。

3. 线程池适用于大量、重复的任务执行场景,可以提高程序的效率和性能。

4. CompletableFuture是Java 8新增的类,充分利用了Lambda表达式和流式操作的特性,使用相对简单。

通过合理地选择和使用多线程的方式,可以提高程序的效率和性能,充分发挥多核处理器的优势,实现更高效的任务处理。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3013

    浏览量

    116959
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    21137
  • 线程池
    +关注

    关注

    0

    文章

    58

    浏览量

    7432
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SGG-北京总部Java20250625-12月结课

    等生产环境事故时,能够迅速进行性能调优与故障排查,而非束手无策。同时,课程重点攻克了多线程并发编程与 JUC(Java Util Concurrent)工具包的应用,结合锁机制、线程池与并发容器的深度
    发表于 05-01 17:33

    逆风C++QT中控台逆向课程

    https://www.bilibili.com/opus/1178756596191199237 QT中控逆向:多线程逻辑与消息处理分析 在软件逆向工程领域,QT框架因其跨平台特性和丰富的功能模块
    的头像 发表于 04-27 10:06 108次阅读

    Java并发编程的“基石”——多线程概念初识

    Java 的内存可见性机制(如 happens-before 原则)能够确保在极端并发下,任何一个调度节点看到的集群状态都是一致且准确的,从根本上杜绝了“脑裂”和资源超卖。 其次是 精妙的多线程协同
    发表于 04-16 18:50

    寻找对RISCV众核并行计算感兴趣的伙伴、朋友

    函数分配到不同的CPU上并行运行。使C/C++/Verilog/Java/OpenCL等也变成并行编程语言,即传统编程语言的并行化。 多核间通信方式包括共享变量自动复制,事件通知,远程函数调用,队列
    发表于 03-28 14:41

    【瑞萨RA × Zephyr评测】多线程和看门狗

    本文章旨在评估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 开发板上实现多线程调度与硬件看门狗功能的应用。评估内容包括任务调度、看门狗初始化流程、主程序逻辑的详细解析,以及实验现象与数据分析。
    的头像 发表于 01-10 10:23 2714次阅读
    【瑞萨RA × Zephyr评测】<b class='flag-5'>多线程</b>和看门狗

    解析Linux的进程、线程和协程

    和系统资源。线程的引入使得多核处理器得以充分利用,因为多线程程序可以更有效地分配和管理多核心的计算资源。 线程的特点包括: (1)共享性:线程之间共享同一进程的地址空间,可以更容易
    发表于 12-22 11:00

    多线程的系统

    多线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执
    发表于 12-08 07:55

    Linux多线程对比单线程的优势

    ,而单线程则需要通过进程间通信来实现。「上下文切换开销小」:线程的上下文切换比进程小,因为它们共享相同的地址空间。「提高响应性」:多线程可以使程序更加响应用户输入或其他事件,避免阻塞。
    发表于 12-01 06:11

    MCU固件几种Flash(闪存)划分方式

    你通过U盘、OTA远程等方式下载的程序,其实你还是需要提前下载BootLoader程序,才能进一步下载APP程序。     今天就来说说通过OTA方式升级固件时,几种Flash(闪存)划分方式
    的头像 发表于 11-27 18:20 1426次阅读

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    科普 | 5G公网对讲有几种实现方式

    对讲机的通信方式,通过PTT按键,实现一键对讲的通信方式,应用在一些关键业务通信,应急通信,行业工作环境下的通信需求。要实现5G公网对讲现在有两种
    的头像 发表于 09-03 14:14 1386次阅读
    科普 | 5G公网对讲有<b class='flag-5'>几种</b><b class='flag-5'>实现</b><b class='flag-5'>方式</b>?

    【HZ-T536开发板免费体验】—— linux创建线程

    的执行任务成为单线程多线程是程序中包含多个执行流,在一个程序中可以同时运行多个不同的线程来执行不同的任务。 多线程提高了CPU的使用卤率。多线程
    发表于 09-01 21:31

    缓存之美:万文详解 Caffeine 实现原理(上)

    用于统计元素访问频率的 Count-Min Sketch 数据结构、理解内存屏障和如何避免缓存伪共享问题、MPSC 多线程设计模式、高性能缓存的设计思想和多线程间的协调方案等等,文章最后会对全文内容进行总结,希望大家能有所收获的同时在未来对本地缓存选型
    的头像 发表于 08-05 14:49 845次阅读
    缓存之美:万文详解 Caffeine <b class='flag-5'>实现</b>原理(上)

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 770次阅读