繁体   English   中英

使两个线程独立于进程,而无需睡眠/等待/通知

[英]make two threads process independent without sleep/wait/notify

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

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

问题:

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

所需的解决方案:

即使到那时下载线程的处理时间也超过1分钟,我应该调用writefile 15次(15 * 4secs)。 (等待或睡眠方法会延迟我的过程,因为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();
            }
        }
    }
}

这里有几点。

  1. 您的代码不是异步运行的,因为您在每个循环的结尾都加入了线程。 这意味着主线程每次都必须等待其他线程完成。

  2. 没有理由每次都重新创建线程。 这浪费了开销。

  3. 如所指出的,您似乎并没有以线程安全的方式处理数据结构。 不确定为什么要传递列表以进行下载,因为它具有全局静态实例。

您得到了想要的东西,我将执行以下操作:

  1. 启动一个线程来进行提要监视。 让它在线程内循环。

  2. 使用线程工作器池进行下载。 没有理由一次不运行一个以上的下载,但是您可能确实希望限制总数。

  3. 确保您锁定对共享数据结构的访问。 应该这样做,以便访问非常快,所以两个线程都不会长时间阻塞。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM