【问题标题】:sort a List using 2 threads使用 2 个线程对列表进行排序
【发布时间】:2012-05-28 08:24:01
【问题描述】:

我正在做一个项目,但我没有得到这部分:

使用两个线程对 ArrayList 进行排序。每个线程都会有一种 名单的一半。主线程将等待两个线程完成, 然后他将负责合并两个列表中的两个列表 其他线程。最后,我们将有一个排序列表。将两者合并 列表不应该是那种传统的方式。

我在class ListePersonne 中尝试这样,这个类对ArrayList 进行排序:

 Thread T1 = new ListePersonne( mylist.subList(0, unique.size()/2));
 Thread T2 = new ListePersonne(mylist.subList(unique.size()/2, unique.size())  );
 T1.start();
 T2.start();

但结果我只完成了第一部分,但没有完成第二部分

【问题讨论】:

  • 您是否等待线程完成?
  • 如果是合并你不明白,看这个合并排序算法:en.wikipedia.org/wiki/Merge_sort
  • 您没有提供足够的代码/信息来诊断。在合并列表部分之前,您必须在两个线程上 join,这是一回事。
  • @user1417996 请提供整个源代码,您如何处理结果、合并列表等

标签: java multithreading sorting arraylist


【解决方案1】:

1) 检查两个子列表的合并排序是否完成

2) 检查您是否使用了多线程对数组列表的同步访问。

【讨论】:

  • 不,我没有使用同步访问,我的列表中只有 10 个元素!
  • 不,两个工作人员之间没有共享数据,因此不需要同步。但是@user1417996,你有一个非常误导的理由不同步!列表中有多少元素有什么关系?
  • 即使你有一个共享变量并从多个线程访问它也可能是一个问题:en.wikipedia.org/wiki/Java_Memory_Model
【解决方案2】:

arraylist 不是线程安全的

改用矢量?

http://developer.android.com/reference/java/util/Vector.html

【讨论】:

  • 数组列表一次只能从一个线程中使用,因此线程安全不是问题。
  • 仅供参考,向量也不是线程安全的。它们只是同步,这实际上弊大于利。
【解决方案3】:

因为这是家庭作业,所以我不会给你代码。这里有提示

  1. Future<List>Callable<List>executor 一起使用。 Callable<T> 允许您返回与 Runnable 不同的类型,后者不能。
  2. future.get() 将阻塞直到线程完成执行。做 这适用于两个线程。
  3. 获得两个排序列表后,合并。

不知道你的老师是否会接受这个解决方案,但万一他没有教你关于 Executor 框架的知识,但我相信你能说服他/她 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2015-12-03
    • 2014-01-07
    • 2018-03-17
    • 1970-01-01
    • 2023-03-29
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多