gpt4 book ai didi

java - 使两个线程独立于进程,而无需 sleep /等待/通知

转载 作者:行者123 更新时间:2023-12-03 13:09:13 25 4
gpt4 key购买 nike

我正在运行两个线程,其中一个线程是读取Feed,并将元素获取到全局变量中,另一个线程用于从全局变量中获取信息,它将开始下载文件。

写入文件线程的处理时间仅需数毫秒,而下载线程的处理时间则可能长达40秒以上,因为它取决于文件。

问题 :

writefile 线程必须每4秒运行一次,因为我不会错过每秒钟提供信息的Feed,但是如果我运行以下程序,则 writefile 线程根本不会执行,直到下载线程完成其过程为止。

所需的解决方案:

甚至下载线程的处理时间也超过了1分钟,那时我应该调用 writefile 15次(15 * 4secs)。
(等待或 sleep 方法将延迟我的过程,因为Feed仅在几个小时内就给了我成千上万个文件)

请通过下面的代码。请编辑并分享知识。

提前致谢

  public class Upload {
static List<DTOs> list = new ArrayList<E>();
String date = "";
Map<String, DTO> map = new HashMap<String, DTO>();

public static void main(String[] args) {
while (true) {
Thread writefile = new Thread() {
public void run() {
write();
// map collection is being used in download thread and also
// list
}
};

Thread download = new Thread() {
public void run() {
downloadProcess(list, date);
}
};

writefile.start();
download.start();

try {
writefile.join();
download.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

最佳答案

这里有几点。

  • 您的代码不是异步运行的,因为您在每个循环的结尾都加入了线程。这意味着主线程每次都要等待其他线程完成。
  • 没有理由每次都重新创建线程。这浪费了开销。
  • 如前所述,您似乎没有以线程安全的方式处理数据结构。不确定为什么要传递列表以进行下载,因为它具有全局静态实例。

  • 您得到了想要的东西,我将执行以下操作:
  • 启动一个线程来进行提要监视。让它在线程内循环。
  • 使用线程工作程序池进行下载。没有理由一次不运行一个以上的下载,但是您可能确实希望限制总数。
  • 确保您锁定对共享数据结构的访问。应该这样做,以便访问非常快,所以两个线程都不会长时间阻塞。

  • 因此,总体算法是启动一个监视线程,启动一个管理用于下载的线程池的工作委派线程,让监视线程接收一个新文件或一组文件进行下载。锁定共享数据的时间必须足够长,以更新待处理列表。当工作线程可用时,将下载管理器线程锁定的时间仅足够长,以拉出下一个作业。

    关于java - 使两个线程独立于进程,而无需 sleep /等待/通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314382/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com