Java在类中启动多个线程

时间:2017-11-08 01:32:28

标签: java multithreading java-8

我从某个来源(比如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
   }
}

我希望有两个帖子 - consumedumpconsume应该连续运行,而dump会定期唤醒,转储消息,清除缓冲区然后再次进入睡眠状态。

我无法以consume()dump()作为主题启动。老实说,我不知道该怎么做。我们甚至可以作为线程运行成员方法吗?或者我是否必须为使用转储单独制作Runnable个类?如果是这样,我将如何在这些之间共享messages

1 个答案:

答案 0 :(得分:3)

首先,您无法真正使用ArrayList。 ArrayList不是线程安全的。例如,查看BlockingQueue。你将不得不处理背压这样的事情。不要使用无限制的队列。

启动一个线程非常简单,你可以使用lambdas。

public void run() { new Thread(this::consume).start(); new Thread(this::produce).start(); }

应该有效,但几乎无法控制这些过程何时结束。