我需要模仿一些向Kafka发送请求的客户的行为。一个客户机启动会话并以不同的时间表发送不同的请求(a类请求每10秒发送一次,b类请求每5秒发送一次,以此类推)因此,我需要实现一些多线程执行器,在这里每个线程将执行一些不同的请求,在不同的时间安排。有人能帮我想一想在这里可以应用哪种java并发工具吗?或者我想实现一个大的调度程序池来存储所有客户机的任务,并为空闲线程提供任务和任务上下文?
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以上,则任务将在不同的线程上运行,但不会并行运行同一任务!作为可运行或可调用的任务传递给执行器服务。但你必须知道这两种方法都能处理好你的工作,对你来说没有区别。有时实现自己的线程来处理这类作业可能更好
pdtvr36n2#
executors框架使得安排一个重复的任务非常容易。将您的任务定义为 Runnable 或者 Callable .指定初始延迟以及重复的频率。
Runnable
Callable
ScheduledExecutorService ses = Executors. newSingleThreadScheduledExecutor() ; ses.scheduleAtFixedRate( myRunnable , 1 , 10 , TimeUnit.SECONDS ) ; ses.scheduleAtFixedRate( myOtherRunnable , 3 , 5 , TimeUnit.SECONDS ) ;
一定要关闭executor服务。否则,后台线程池可能会像僵尸一样继续运行?♂️.
2条答案
按热度按时间798qvoo81#
您可以轻松地使用java.util.timer来处理您的作业!
例子:
这些任务都在同一个线程中运行,所以如果您有高计算任务,或者如果任务在运行后等待某些东西,比如读或写文件,则为不同类型的请求创建2个不同的计时器。
schedule()的第一个参数也是timertask对象的一个示例,您可以轻松地扩展它来创建自定义任务并为其提供所需的值。
编辑:
正如在注解中提到的,您也可以使用executor服务来完成。
例子:
如果将池大小设置为1,则所有任务都在同一线程中运行,如果将池大小设置为1以上,则任务将在不同的线程上运行,但不会并行运行同一任务!
作为可运行或可调用的任务传递给执行器服务。
但你必须知道这两种方法都能处理好你的工作,对你来说没有区别。有时实现自己的线程来处理这类作业可能更好
pdtvr36n2#
executors框架使得安排一个重复的任务非常容易。
将您的任务定义为
Runnable
或者Callable
.指定初始延迟以及重复的频率。
一定要关闭executor服务。否则,后台线程池可能会像僵尸一样继续运行?♂️.