Java线程池的使用(3)

本文探讨了ThreadPoolExecutor的工作原理,包括如何通过addWorker()方法添加任务,并对比了execute()与submit()方法的不同之处。此外,还展示了ScheduledThreadPoolExecutor的实际应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上一章其实是介绍了ThreadPoolExecutor中的addWorker()方法,解析该方法我们了解了ThreadPoolExecutor添加新任务的一整套流程:判断线程池是否处于Running状态,因为SHUTDOWN下的线程池是不能添加任务的,而后更新线程池内的线程数并于corePoolSize比较,接着才能添加任务。Worker是实现了Runnable接口的。

execute()submit()的区别

execute()方法用于执行不需要返回结果的任务,因此execute()之后我们无从得知任务是否被线程池成功执行,而submit()则会返回一个实现了Future接口的对象(也就是FutureTask),通过这个对象就可以判断任务执行成功与否。

public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }
//其中依然会调用execute()来执行任务

关于FutureTask,它实现了RunnableFuture接口,然后RunnableFuture又继承RunnableFuture接口。我们可以通过FutureTask实例的get()方法获取返回值,调用get()时会阻塞当前线程直至任务完成,而调用
get(long timeout,TimeUnit unit)则会阻塞当前线程一段时间后立即返回,即使任务还没有执行完。此外,调用FutureTask对象的cancel(boolean mayInterruptIfRunning)方法可以取消任务的执行。

ThreadPoolExecutor与ScheduledThreadPoolExecutor实例

/**
 * 使用ScheduledExecutorService和ScheduledThreadPoolExecutor实现的java调度程序示例程序。
 */
public class ScheduledThreadPoolDemo {

    public static void main(String[] args) throws InterruptedException {

        //创建一个ScheduledThreadPoolExecutor对象
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        //计划在某段时间后运行
        System.out.println("Current Time = "+new Date());
        for(int i=0; i<3; i++){
            Thread.sleep(1000);
            WorkerThread worker = new WorkerThread("do heavy processing");
            //创建并执行在给定延迟后启用的单次操作。 
            scheduledThreadPool.schedule(worker, 10, TimeUnit.SECONDS);
        }

        //添加一些延迟让调度程序产生一些线程
        Thread.sleep(30000);
        System.out.println("Current Time = "+new Date());
        //关闭线程池
        scheduledThreadPool.shutdown();
        while(!scheduledThreadPool.isTerminated()){
            //等待所有任务完成
        }
        System.out.println("Finished all threads");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值