【发布时间】:2017-02-18 11:11:26
【问题描述】:
我正在运行两个线程,其中一个线程是读取 Feed 并将元素放入全局变量中,另一个线程用于从全局变量中获取信息,它将开始下载文件。
writefile 线程的处理时间仅需毫秒,download 线程的处理时间可能需要最多超过 40 秒,因为它取决于文件。
问题:
writefile 线程必须每 4 秒运行一次,因为我不会错过每秒提供信息的 Feed,但如果我运行以下程序,writefile 线程在 download 线程完成其进程之前根本不会执行。
需要解决方案:
即使 download 线程处理时间超过 1 分钟,我也应该调用 writefile 15 次(15*4 秒)。 (等待或睡眠方法会延迟我的进程,因为 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();
}
}
}
}
【问题讨论】:
-
你的集合不是线程安全的,你的线程只运行一次,不清楚为什么你有多个线程,因为你说一个运行得很快,而另一个花费大部分时间等待网络。
-
@PeterLawrey 一个线程正在读取提要,与另一个线程相比,它的速度更快。我正在 while 循环中启动两个线程。
-
我明白了,但它并没有解决我的观点,即您为什么要这样做或为什么集合不是线程安全的。提示:它更复杂,但不保证更快。
-
我真正的问题是两个线程应该独立工作,一个不应该等待另一个执行它的进程,你问的是我正在使用的变量,但这不是我真正关心的问题
-
很难知道该建议您做什么,因为它一开始似乎没有意义。线程同时运行,但没有线程安全,无法保证一个线程何时/是否会看到另一个线程的更新。
标签: java multithreading thread-safety