Java线程池并发执行多个任务方式

当需求场景为处理大量并发任务时,我们通常使用线程池来优化性能。Java线程池可以控制并发线程数量,避免资源超额占用以及线程切换开销过大的问题。常见的线程池类有ThreadPoolExecutor和Executors等。在使用线程池时,我们可以通过不同的线程池参数及处理方式控制任务执行效率。

一、Java线程池的创建

//创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10);

ThreadPoolExecutor类可以通过自定义的方式创建线程池,通过以下参数控制线程池:
- corePoolSize:核心线程数,当提交任务数小于核心线程数时,即使有其他空闲线程也不会创建,只有当核心线程都已经处于忙碌状态时,才会创建新的线程执行。
- maximumPoolSize:最大线程数,线程池中最大线程数不能超过该参数。当提交任务数超过核心线程数时,会不断创建新的线程,直到线程数达到最大值。
- keepAliveTime:线程池中空闲线程的存活时间。
- unit:keepAliveTime的时间单位。
- workQueue:任务队列,用于存储待执行的任务。

二、Java线程池的执行方式

线程池通过execute方法执行线程任务,该方法可以接收Runnable和Callable两种类型的参数。

  1. Runnable
    Runnable是一个接口,实现该接口后,需要重写run方法,将要执行的任务放在该方法里。

示例1:

threadPool.execute(new Runnable() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " -> start");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " -> end");
    }
});

示例2:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " -> start");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " -> end");
    }
}

MyRunnable myRunnable = new MyRunnable();
threadPool.execute(myRunnable);

上面两个示例都是通过execute方法提交Runnable任务,实现了多个任务并发执行的效果。

  1. Callable
    Callable也是一个接口,实现该接口后,需要重写call方法,该方法可以返回一个结果对象。

示例3:

Future<String> future = threadPool.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " -> start");
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName() + " -> end");
        return "hello, callable!";
    }
});

try {
    //等待任务执行完成并获取执行结果
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

上面示例3是通过submit方法提交Callable任务到线程池中并返回Future对象,可以通过该对象获取正在执行的状态和执行结果。

三、Java线程池的关闭与退出

当不再需要线程池时,需要将其关闭,以避免线程池一直处于运行状态、占用资源。线程池的关闭有两种方式:

  1. shutdown()
    该方法要求线程池中的任务执行完后退出。该方法会等待当前正在执行的任务执行完或者等待超时,如果超时则进行强制关闭。
threadPool.shutdown();
  1. shutdownNow()
    该方法会立即强制关闭线程池,不管任务是否结束。如果正在执行的任务被中断,则任务将返回一个InterruptedException。
threadPool.shutdownNow();

四、Java线程池的异常处理

当线程池中发生异常时,需要对其进行处理。可以通过自定义ThreadFactory的方式创建线程池,对异常进行捕获和处理。

public class CustomThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("线程" + t.getName() + "发生了异常:" + e.getMessage());
            }
        });
        return thread;
    }
}
ExecutorService threadPool = new ThreadPoolExecutor(
        5, 10, 10,
        TimeUnit.SECONDS, new LinkedBlockingQueue<>(50),
        new CustomThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

在上面的示例中,通过自定义ThreadFactory并设置UncaughtExceptionHandler对异常进行捕获和处理,当线程池中的线程发生异常时,会打印出异常信息。

以上就是Java线程池并发执行多个任务的完整攻略,通过示例讲解了如何创建线程池、不同任务执行方式以及线程池的关闭、异常处理等重要内容,可以对Java线程池相关知识进行全面学习。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程池并发执行多个任务方式 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java线程池的几种实现方法及常见问题解答

    Java线程池的几种实现方法及常见问题解答 什么是线程池 线程池是一种预处理一定数量的线程,并将它们存放在池子中,以便随时执行多个任务,而不用反复创建新线程或销毁已经没有用的线程。线程池线程的数量可以根据需要自动增加或减少,在使用线程池时,我们只需要向池子中添加执行的任务即可,任务会自动分配到池子中的线程执行,执行完成后,线程不会被销毁,而是放回池子中,供其…

    多线程 2023年5月17日
    00
  • 详解Java多线程编程中的线程同步方法

    关于“详解Java多线程编程中的线程同步方法”的攻略,我会从以下几个方面进行讲解: 理解多线程编程中的线程安全问题 线程同步方法的概念和使用 线程同步方法的种类和示例 1. 理解多线程编程中的线程安全问题 在多线程编程中,线程安全是一个非常重要的概念,指的是多个线程同时访问共享资源时,能够保证程序的正确性和可靠性。 例如,如果多个线程同时读取或写入同一个变量…

    多线程 2023年5月17日
    00
  • C#中的并发集合Concurrent类

    下面我将为你讲解C#中的并发集合Concurrent类的完整攻略。 什么是Concurrent类? C#中的Concurrent classes是线程安全的集合,它们在处理多线程或异步代码时非常有用。 Concurrent classes属于System.Collections.Concurrent命名空间,C#提供了一些常用的Concurrent类,如Co…

    多线程 2023年5月17日
    00
  • JAVA如何解决并发问题

    为了解决并发问题,Java提供了以下解决方法: 同步方法(Synchronized Methods) 同步方法可以解决多线程访问共享数据时的并发问题。同步方法在方法签名中使用synchronized关键字来标记,使得该方法在同一时间只能被一个线程执行。当一个线程执行同步方法时,其他线程无法访问该方法,直到该线程完成对共享数据的操作并退出该方法。 示例1: p…

    多线程 2023年5月16日
    00
  • Nodejs实战心得之eventproxy模块控制并发

    Node.js实战心得之eventproxy模块控制并发 什么是eventproxy模块 eventproxy模块是Node.js中一个流行的第三方模块,用于控制异步并发。它通过定义事件与处理定制逻辑来解决异步嵌套问题,提供更好的可读性和可维护性。 使用eventproxy模块,可以避免回调函数嵌套过深,提高代码的可阅读性,同时也避免了异步操作中的“回调地狱…

    多线程 2023年5月16日
    00
  • 浅析Linux下一个简单的多线程互斥锁的例子

    下面是“浅析Linux下一个简单的多线程互斥锁的例子”的完整攻略。 什么是互斥锁? 互斥锁是一种为了保护临界区资源而提供的同步原语。当一个线程获得了互斥锁之后,其他所有的线程都将被阻塞,直到这个线程释放了互斥锁。这样就保证了临界区资源的独占性,避免了并发访问可能带来的数据竞争问题。 Linux下简单的多线程互斥锁的例子 以下是一个使用互斥锁的线程代码示例。这…

    多线程 2023年5月16日
    00
  • php使用curl并发减少后端访问时间的方法分析

    PHP使用cURL并发技术实现优化后端访问时间 在高并发的web应用中,后端向多个不同的目标执行HTTP请求是很常见的,并发执行这些请求是可以显著提高应用性能的。cURL库是PHP中强大而常用的HTTP客户端库之一,本文将介绍如何使用cURL的并发技术来减少后端访问时间。 什么是cURL并发技术? cURL并发技术是一种将多个HTTP请求同时发送到后端,并在…

    多线程 2023年5月16日
    00
  • java多线程返回值使用示例(callable与futuretask)

    Java多线程可以实现异步执行任务,提高程序运行效率和响应速度。在多线程执行完成后,需要获取线程执行结果,而Callable与FutureTask就是实现多线程返回值的一种方式。下面就是Java多线程返回值的使用示例(callable与futuretask)。 Callable 接口 Callable接口是一个泛型接口,它声明了call()方法,可以有返回值…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部