JAVA异步实现的四种方式

一、使用Thread类

可以使用Thread类来创建一个新的线程,并在其run()方法中执行操作。例如:

public class MiniProgramController extends Thread{@Overridepublic void run() {System.out.println("1111");}public static void main(String[] args) {MiniProgramController min=new MiniProgramController();min.start();System.out.println("helloworl");}
}

二、使用Runnable接口

可以通过实现Runnable接口并在其中实现耗时操作,并通过Thread类来启动新线程。例如:

public class MiniProgramController implements Runnable{@Overridepublic void run() {System.out.println("1111");}public static void main(String[] args) {MiniProgramController min=new MiniProgramController();min.start();System.out.println("helloworl");}
}

三、使用Callable 接口

前面有两种创建线程的方法,一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口。

Callable 接口的特点如下(重点)

• 为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于Callable,需要实现在完成时返回结果的 call()方法。

• call()方法可以引发异常,而 run()则不能。

• 为实现 Callable 而必须重写 call 方法

• 不能直接替换 runnable,因为 Thread 类的构造方法根本没有 Callable

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyThread implements Callable{@Overridepublic Integer call() throws Exception {return 200;}
}public class CallableDemo {public static void main(String[] args) {//方式一FutureTask futureTask = new FutureTask<>(new MyThread());new Thread(futureTask).start();//方式二FutureTask integerFutureTask = new FutureTask<>(() -> {System.out.println(Thread.currentThread().getName());return 1024;});new Thread(integerFutureTask,"lucy").start();}
}

由于FutureTask实现的是RunnableFuture接口,而RunnableFuture实现了Runnable和Future。
因此

1. FutureTask可作为Runnable的实现传入Thread构造方法中

2. 需要实现callable中的call方法,这个call方法就是我们需要写的逻辑了,需要让这个线程做什么以及需要返回什么结果

四、使用Executor和ThreadPool

可以使用Executor和ThreadPool来创建和管理线程池,从而执行异步操作。例如:

public class MiniProgramController implements Runnable{private static ExecutorService executorService = Executors.newCachedThreadPool();public static void main(String[] args) {executorService.submit(new Runnable() {@Overridepublic void run() {System.out.println("1111");}});System.out.println("helloworld");}
}

备:如果在日常工作中建议使用ThreadPoolExecutor手动创建线程池,并指定合理的线程数量和队列容量,以及适当的拒绝策略,如果直接去使用Executor去线程池有可能会出现OOM的现象。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部