[英]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();
}
}
}
}
这里有几点。
您的代码不是异步运行的,因为您在每个循环的结尾都加入了线程。 这意味着主线程每次都必须等待其他线程完成。
没有理由每次都重新创建线程。 这浪费了开销。
如所指出的,您似乎并没有以线程安全的方式处理数据结构。 不确定为什么要传递列表以进行下载,因为它具有全局静态实例。
您得到了想要的东西,我将执行以下操作:
启动一个线程来进行提要监视。 让它在线程内循环。
使用线程工作器池进行下载。 没有理由一次不运行一个以上的下载,但是您可能确实希望限制总数。
确保您锁定对共享数据结构的访问。 应该这样做,以便访问非常快,所以两个线程都不会长时间阻塞。
因此总体算法是启动一个监视线程,启动一个管理委派线程池以供下载的工作委派线程,让监视线程接收新文件或一组文件进行下载。 仅将共享数据锁定足够长的时间,以更新待处理列表。 当工作线程可用时,将下载管理器线程锁定的时间仅足够长,以拉出下一个作业。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.