✅P193_商城业务-异步-异步复习
大约 2 分钟
一、初始化线程的 4 种方式
- 继承 Thread
- 实现 Runnable 接口
- 实现 Callable 接口 + FutureTask (可以拿到返回结果,可以处理异常)
- 线程池
方式 1 和方式 2:主进程无法获取线程的运算结果。不适合当前场景;
方式 3:主进程可以获取线程的运算结果,但是不利于控制服务器中的线程资源。可以导致服务器资源耗尽;
方式 4:通过如下两种方式初始化线程池
Executors.newFiexedThreadPool(3);
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory, handler);
通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。
二、举例
2.1 继承Thread类的方式实现
public class ThreadTest {
/**
* @Description 继承Thread方式
* @param
* @return
*/
public static class MyThread extends Thread {
@Override
public void run() {
System.out.println("I am a child Thread");
}
}
public static void main(String[] args) {
//创建线程
MyThread myThread = new MyThread();
//启动线程
myThread.start();
}
}
2.2 实现Runnable接口的run方法方式
/**
* @Description 实现Runnable接口方式
* @param
* @return
*/
public static class RunnableTask implements Runnable {
@Override
public void run() {
System.out.println("I am a child Thread");
}
}
public static void main(String[] args) {
RunnableTask runnableTask = new RunnableTask();
new Thread(runnableTask).start();
new Thread(runnableTask).start();
}
2.3 实现 Callable 接口 + FutureTask
/**
* @param
* @Description 创建任务类,类似Runnable
* @return
*/
public static class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "hello";
}
}
public static void main(String[] args) throws InterruptedException {
//创建异步任务
FutureTask<String> futureTask = new FutureTask<>(new CallerTask());
//启动线程
new Thread(futureTask).start();
try {
//等待任务线程执行完毕,返回结果
String result = futureTask.get();
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
2.4 线程池
通过如下两种方式初始化线程池: 1、Executors.newFiexedThreadPool(10);
public class Test {
public static ExecutorService service = Executors.new FixedThreadPool(10);
public static void main(String... args) {
System.out.println("main...start...");
service.execute(new RunnableTask());
System.out.println("main...end...");
}
}
2、ThreadPoolExecutor七个参数。 参考
ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, TimeUnit unit,
workQueue, threadFactory, handler);
通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。