调度任务在java中对多线程执行进行分组



我需要模拟一些客户端向Kafka发送请求的行为。

一个客户端启动会话并发送具有不同时间表的不同请求。(A类请求每10秒发送一次,B类请求每5秒发送一次等(

所以,我需要实现一些多线程执行器,在这段时间里,每个线程都会用不同的时间表执行一些不同的请求。

有人能帮助我了解Java并发的哪种工具可以在这里应用吗?

或者,我想实现一个大的调度程序池,它将存储所有客户端的任务,并为空闲线程提供任务和任务上下文?

Executors框架使调度重复任务变得非常容易。

将您的任务定义为RunnableCallable

指定初始延迟以及重复频率。

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

请确保关闭执行器服务。否则,后台线程池可能会像僵尸一样继续运行🧟‍♂️.

您可以轻松地使用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个不同的计时器。

time.scheule((的第一个参数也是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,则您的任务在不同的线程上运行,但决不能并行运行同一任务!

任务以可运行调用的形式传递给执行器服务。

但你必须知道这两种方式都能处理好你的工作,对你来说没有区别。也许有时候实现自己的线程来处理这种类型的作业会更好。(相关问题(

最新更新