1.JAVA多线程有哪几种实现方式
2.再见了Future,线k线图解JDK21虚拟线程的程池程池结构化并发
JAVA多线程有哪几种实现方式
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、源码使用ExecutorService、解析Callable、线k线Future实现有返回结果的程池程池官网素材源码多线程。其中前两种方式线程执行完后都没有返回值,源码只有最后一种是解析带返回值的。1、线k线继承Thread类实现多线程
继承Thread类的程池程池方法尽管被我列为一种多线程实现方式,但Thread本质上也是源码实现了Runnable接口的一个实例,它代表一个线程的解析从站ssc源码实例,并且,线k线启动线程的程池程池唯一方法就是通过Thread类的start()实例方法。start()方法是源码一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
[java] view plain copy
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
在合适的地方启动线程如下: [java] view plain copyMyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
2、实现Runnable接口方式实现多线程
如果自己的整数小数的源码类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
[java] view plain copypublic class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例: [java] view plain copyMyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码: [java] view plain copypublic void run() {
if (target != null) {
target.run();
}
}
3、使用ExecutorService、Callable、抖数据源码Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问/topic/ ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的过客源码铺,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。
再见了Future,图解JDK虚拟线程的结构化并发
Java为我们提供了多种并发编程手段,本文将探讨一些关键概念和方法。首先,简要介绍基础方法,即使用Lambda表达式创建平台线程。然而,这种方法在大多数应用程序服务器中不被鼓励,因此转向更高级的解决方案,如Java的Futures。
JDK 5引入了Futures类,允许开发者将任务提交到线程池并返回结果。通过ExecutorService接口实现任务提交,它是一个用于管理任务执行的机制。然而,Futures存在一些问题,例如,使用Platform线程时,获取结果的操作会阻塞线程,这可能导致性能问题。
Java 的虚拟线程(Virtual Threads)提供了改进,通过使用Virtual Threads,当使用future.get()方法阻塞线程时,底层的平台线程不会被阻塞。这解决了Futures中的一个关键问题。同时,使用CompletableFuture Pipelines也可以解决阻塞问题,但本文将重点介绍Virtual Threads的优势。
结构化并发的概念旨在更好地组织和管理任务执行。它强调了一个块(如方法或块)内启动的所有任务应在该块结束时终止。这样可以实现更清晰的代码结构和易于理解的执行顺序。Java 中引入的StructuredTaskScope类试图提供更干净的结构化并发模型,它能够更好地处理任务之间的关系。
StructuredTaskScope类能够自动取消在任一任务失败时执行的后续任务,确保没有未完成的任务遗留。通过使用StructuredTaskScope创建的结构化任务范围,可以实现代码的模块化和一致性,提高开发效率。
本文示例展示了一个用例,其中两个任务可以并行运行,然后将结果合并到单个对象中返回。通过使用StructuredTaskScope.ShutdownOnFailure()方法,可以确保在任一任务失败时,其他任务自动被取消。这避免了等待时间过长或保留未明确终止的线程的问题。
在编写使用StructuredTaskScope的代码时,开发者需要确保任务能够正确处理取消期间设置的中断标志。任务应该检查并适当终止,以确保用例的响应性。总的来说,StructuredTaskScope和Virtual Threads共同提供了一种强大的并发编程方法,适用于将任务拆分为多个子任务的复杂用例。