java中的计划任务组多线程执行

jv4diomz  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(445)

我需要模仿一些向Kafka发送请求的客户的行为。
一个客户机启动会话并以不同的时间表发送不同的请求(a类请求每10秒发送一次,b类请求每5秒发送一次,以此类推)
因此,我需要实现一些多线程执行器,在这里每个线程将执行一些不同的请求,在不同的时间安排。
有人能帮我想一想在这里可以应用哪种java并发工具吗?
或者我想实现一个大的调度程序池来存储所有客户机的任务,并为空闲线程提供任务和任务上下文?

798qvoo8

798qvoo81#

您可以轻松地使用java.util.timer来处理您的作业!
例子:

public static void main(String [] args)
{
        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("SEND A-TYPE REQUEST");
            }
        } , 0 , 10000);// 0ms first execution delay and 10000ms period

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("SEND B-TYPE REQUEST");
            }
        } , 0 , 5000); // 0ms first execution delay and 5000ms period

}

这些任务都在同一个线程中运行,所以如果您有高计算任务,或者如果任务在运行后等待某些东西,比如读或写文件,则为不同类型的请求创建2个不同的计时器。
schedule()的第一个参数也是timertask对象的一个示例,您可以轻松地扩展它来创建自定义任务并为其提供所需的值。
编辑:
正如在注解中提到的,您也可以使用executor服务来完成。
例子:

public static void main(String [] args)
{
        java.util.concurrent.ScheduledExecutorService scheduledExecutorService =
                java.util.concurrent.Executors.newScheduledThreadPool(1); // pool thread size

        scheduledExecutorService.scheduleAtFixedRate(
                new Runnable() {
                    public void run() {
                        System.out.println("SEND A-TYPE REQUEST");
                    }
                }
                , 0 , 10 , TimeUnit.SECONDS); // 0s first execution delay and 10s period

        scheduledExecutorService.scheduleAtFixedRate(
                new Runnable() {
                    public void run() {
                        System.out.println("SEND B-TYPE REQUEST");
                    }
                }
                , 0 , 5 , TimeUnit.SECONDS); // 0s first execution delay and 5s period

}

如果将池大小设置为1,则所有任务都在同一线程中运行,如果将池大小设置为1以上,则任务将在不同的线程上运行,但不会并行运行同一任务!
作为可运行或可调用的任务传递给执行器服务。
但你必须知道这两种方法都能处理好你的工作,对你来说没有区别。有时实现自己的线程来处理这类作业可能更好

pdtvr36n

pdtvr36n2#

executors框架使得安排一个重复的任务非常容易。
将您的任务定义为 Runnable 或者 Callable .
指定初始延迟以及重复的频率。

ScheduledExecutorService ses = Executors. newSingleThreadScheduledExecutor() ;
ses.scheduleAtFixedRate( myRunnable , 1 , 10 , TimeUnit.SECONDS ) ;
ses.scheduleAtFixedRate( myOtherRunnable , 3 , 5 , TimeUnit.SECONDS ) ;

一定要关闭executor服务。否则,后台线程池可能会像僵尸一样继续运行?‍♂️.

相关问题