【问题标题】:Run two tasks at the same time changing one variable同时运行两个任务改变一个变量
【发布时间】:2014-04-16 00:34:45
【问题描述】:

我的问题与here 这个问题有关。我基本上想同时做两个任务:

  1. 从提要中收集数据并将其添加到对象列表中
  2. 阅读 对象列表,将其添加到数据库并删除添加到数据库的内容 从对象列表中

因此,我正在更改这两个单独任务中的对象列表,但我不确定如何共享它并使其可用于同时运行的两个任务进行更改。 我想在两个不同的任务中执行此操作的原因是因为来自提要的数据通常每 5 秒提供一次,这使我没有足够的时间来处理它并将其添加到数据库中。

我希望有人可以提供帮助。谢谢。

----编辑

我从here 发现了另一个问题,它似乎给了我我需要的东西。所以目前我有这样的代码:

class MainThread {
    private void MainThread() {
        while(true)
       {
         //get json data

        List<Object> obj = //json data to list of object;        

        SecondThread second = new SecondThread(obj);
        second.start();
       }

    }
}

class SecondThread extends Thread {
    List<Object> obj;

    public void SecondThread(List<Object> obj) {
    this.obj = obj;
    }
    public void run() {

    //add list to db

    }
}

我想知道的是,如果 MainThread 中的 while 循环等待 SecondThread 在开始另一个循环之前完成处理/将数据放入数据库中?

【问题讨论】:

  • 你是指任务还是线程? (“任务”通常表示“进程”。)请注意,如果您无法在 5 秒内处理数据,则第二个线程可能不会提高您的吞吐量,除非它在另一个处理器上运行......即使那样也可能不会帮助取决于限制因素是什么。相反,您可能需要一个可以跟上传入数据的数据收集线程,该线程将工作到一个或多个处理线程,这些线程需要尽可能长的时间。
  • 对不起,我想我的意思是线程。您对数据收集线程的建议听起来像我需要的。介意给我举个例子吗?
  • 网络上有很多使用线程进行 Java 编程的示例和教程。看看他们,根据其中一个尝试一些东西,然后带着具体问题回到我们这里。
  • 嗨@keshlam。请看我的编辑

标签: java feed multitasking


【解决方案1】:

由于您似乎在第一组问题中找到了一些东西,所以我将回答您的最后一个问题:

我想知道的是,如果 MainThread 中的 while 循环等待 SecondThread 在开始另一个循环之前完成处理/将数据放入数据库中?

在您的示例中,MainThread 永远不会等待SecondThread 完成,它将不断执行其 while 循环。在您的代码中,您正在一个 while 循环内创建 SecondThread,这将在您的应用程序崩溃之前创建大量线程。如果你想在做其他事情之前等待一个线程完成,那么你可以这样做:

SecondThread second = new SecondThread(obj);
second.start();
second.join(); //will make current thread wait until this thread finishes before proceeding

请注意,在您的情况下,线程连接基本上只会使您的代码连续,因为 SecondThread 会阻止 MainThread 运行。

【讨论】:

  • 感谢您的澄清。您认为问题 1 有更优雅的解决方案吗?我真的只是希望使用 while 循环收集数据的线程自行运行,而另一个线程将内容添加到数据库中......
  • @obsessiveCookie 我会搜索生产者/消费者设计策略。基本上,如果没有数据要处理,消费者线程将等待。生产者线程将数据添加到共享集合中,然后通知消费者线程有工作要做。
  • 非常感谢 :) 我现在知道去哪里找了!
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多