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

标签 java multithreading thread-safety

我正在运行两个线程,其中一个线程是读取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/

    相关文章:

    java - 如何连接 Philips Hue、CC2531 Zigbee USB Dongle 和 Java

    c++ - pthread_join() 是否允许调用线程继续执行?

    c++ - 这种做法线程安全吗?

    C++ g++ 线程安全构造函数

    c# - 为什么进程会丢失线程?

    java - 热点默认最大堆大小

    java - 使用 tomcat、struts2 和 eclipse 的 java web 应用程序上的 404 错误

    比较 pthread_t 和 int 输入的相等性?

    java - 自定义类加载器问题

    c - 使用 -lpthread 在 C 中实现多线程