✅P193_商城业务-异步-异步复习

gong_yz大约 2 分钟谷粒商城

一、初始化线程的 4 种方式

  1. 继承 Thread
  2. 实现 Runnable 接口
  3. 实现 Callable 接口 + FutureTask (可以拿到返回结果,可以处理异常)
  4. 线程池

方式 1 和方式 2:主进程无法获取线程的运算结果。不适合当前场景;

方式 3:主进程可以获取线程的运算结果,但是不利于控制服务器中的线程资源。可以导致服务器资源耗尽;

方式 4:通过如下两种方式初始化线程池

  • Executors.newFiexedThreadPool(3);
  • new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory, handler);

通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。


二、举例

线程创建与运行open in new window

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七个参数。 参考open in new window

 ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 
                       								 keepAliveTime, TimeUnit unit, 
                       								 workQueue, threadFactory, handler);

通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。