我从某个来源(比如Kafka)消费并定期转储收集的消息(比方说,S3)。我的课程定义如下:
public class ConsumeAndDump {
private List<String> messages;
public ConsumeAndDump(){
messages = new ArrayList<>();
// initialize required resources
}
public void consume(){
// this runs continuously and keeps consuming from the source.
while(true){
final String message = ...// consume from Kafka
messages.add(message);
}
}
public void dump(){
while(true){
final String allMessages = String.join("\n", messages);
messages.clear(); // shown here simply, but i am synchronising this to avoid race conditions
// dump to destination (file, or S3, or whatever)
TimeUnit.SECONDS.sleep(60); // sleep for a minute
}
}
public void run() {
// This is where I don't know how to proceed.
// How do I start consume() and dump() as separate threads?
// Is it even possible in Java?
// start consume() as thread
// start dump() as thread
// wait for those to finish
}
}
我希望有两个帖子 - consume
和dump
。 consume
应该连续运行,而dump
会定期唤醒,转储消息,清除缓冲区然后再次进入睡眠状态。
我无法以consume()
和dump()
作为主题启动。老实说,我不知道该怎么做。我们甚至可以作为线程运行成员方法吗?或者我是否必须为使用和转储单独制作Runnable
个类?如果是这样,我将如何在这些之间共享messages
?
答案 0 :(得分:3)
首先,您无法真正使用ArrayList
。 ArrayList不是线程安全的。例如,查看BlockingQueue
。你将不得不处理背压这样的事情。不要使用无限制的队列。
启动一个线程非常简单,你可以使用lambdas。
public void run() {
new Thread(this::consume).start();
new Thread(this::produce).start();
}
应该有效,但几乎无法控制这些过程何时结束。