Java中的线程排序。

时间:2014-06-20 03:00:58

标签: java multithreading

在java中,我们该怎么做:

  1. 创建并写入单个文件的许多线程。
  2. 由于任何线程都可以写入该文件(通过获取锁定),因此线程写入的顺序消失了。
  3. 创建的线程数将超过40.如果线程不受影响,如何转储线程。

    提前致谢。

2 个答案:

答案 0 :(得分:3)

从您的描述中,最简单的解决方案是让线程保存其结果,并让另一个线程按照您预期的顺序编写它们。 e.g。

int threads = Runtime.getRuntime().availableProcessors();
ExecutorServer es = Executors.newFixedThreadPool(threads);

List<Future<String>> results = new ArrayList<>();
for (int i = 0; i < tasks; i++)
     results.add(es.submit(new Callable<String>() {
          public String call() {
              // task which returns a String
          }
     });
try (PrintWriter fw = new PrintWriter("output.txt")) {
    for (Future f : results)
        fw.println(f.get());
}

如你所见

  • 任务可以按任何顺序执行,但结果会按预期顺序写入文件。
  • 一次执行的任务数量仅限于实际的逻辑CPU数量。

答案 1 :(得分:0)

好吧,线程实际上没有订单,所以你需要以编程方式为它们创建某种池队列。

虽然我不知道Java 1.7是否通过其java.concurrent Classes添加了新东西..这可能会帮助你实现你想要的东西。

但是对于Java 1.6及更低版本,您必须有一个Queue来逐个管理线程,以维护JVM不会执行的实际顺序。