【问题标题】:Issues while trying to implement my own ThreadPool (Concept problems)尝试实现我自己的 ThreadPool 时的问题(概念问题)
【发布时间】:2013-01-11 22:34:09
【问题描述】:

我想和你分享我的想法。
考虑你必须自己实现一个线程池。

我认为它有一些成员字段,例如 Threads 的private static List<Thread> 作为我的“池”。

我也有两种方法:
一种。从池中分配线程。
湾。它将一个线程返回到池中。

我的问题是
1.如何保护List不被某些线程同时访问:
我想用synchronize 声明这两种方法,然后购买意识到这不好,因为我无法执行以下操作:
将一个线程返回到池中,同时从池中取出一个。
我也想过使用像 Vector 这样的线程安全集合,但似乎也有同样的问题。

2.你认为线程池类应该是Singleton吗?您认为代码的哪一部分应该负责分配它的单个实例?

【问题讨论】:

  • 为什么要多个线程访问List<Thread>
  • 因为如果我想从池中获取一些线程,同时另一个线程想被释放,它们将被排队而不是同时处理。假设我已经有一些空闲线程,那么它将从集合中获取线程-现在我们被阻塞了,只有在这结束之后,我们才能将一个线程释放回池
  • 我认为如果你把问题转过来会更容易。不是分发线程,而是接受实现某个接口的对象,选择一个线程并让它执行对象指定的方法。然后您可以轻松捕获可能已终止线程的异常,创建新线程,不必担心恢复线程等。
  • 可以阅读javadoc,直接使用java给出的线程池即可。自 1.5 以来它是 java sdk 的一部分 - 你可以获取 java 源代码。
  • @JavaSa:您只会在分发线程的一小段时间内锁定,然后在线程返回池的一小段时间内锁定。正确的?还是您认为锁定会保留更长时间?

标签: java design-patterns concurrency synchronization threadpool


【解决方案1】:

这个问题的关键在于

您是否打算实际重用一个线程来运行多个任务,从而维护一个线程池而不终止它们 [A] 或

您是否打算将池仅作为限制来控制可以在任何给定点运行的同时任务的数量,并且在每次执行后线程将被终止,并且必须创建另一个线程来代替它。 [乙]

如果未完成的作业请求的总数低于系统限制,则可以通过返回一个新的 Thread 对象很容易地实现[B]。显然,线程对象在退出之前应该知道如何减少公共资源使用计数器。在这种情况下,您不必维护线程集合,而只需维护所有线程对公共引用计数对象(例如信号量)的引用。

[A] 但是,需要一个从 Thread 继承的类,该类在执行完给定任务后不会退出,而是等待下一个任务执行。一旦此类可用,您可以简单地将适当的线程对象引用返回给调用者,并使用一个标记,该标记将以线程安全的方式将线程标记为已使用或未使用。

这是实现此目的的一种简单方法

ArrayList<MyThread>      pool = new ArrayList<MyThread>      (DEFAULT_POOL SIZE);
ArrayList<AtomicBoolean> used = new ArrayList<AtomicBoolean> (DEFAULT_POOL SIZE);

如果您将 pool[i] 返回给调用者,请通过执行将其标记为已使用

used[i].set(true). 

当线程返回池时,将同一对象标记为未使用 (set(false)。显然,您可以通过同步的分配/释放方法执行此操作。由于它们是同步的,因此用于存储池线程的集合不需要同步,您可以使用任何结构/集合,具体取决于您使用的算法来确定接下来要发出哪个线程。

作为一种优化,您可以在第一次请求池化线程时动态创建池(和各个线程) - 这样您无需在它可用之前对其进行初始化。但是您需要以线程安全的方式执行此操作,我不会详细说明。

至于问题 2,除非您想创建多个池,否则最好将池类设为单例,如果不加以检查会很危险。如果您使用的是非静态池对象,它还将使您无需跟踪实例化了多少此类池。

如前所述,您可以通过重用现有的线程池类来省去麻烦,这些线程池类为您很好地处理了场景 A :)

【讨论】:

    【解决方案2】:
    1. 我认为这是一个快速的操作:get、set、delete、add。所以,如果你希望它是线程保存的,你需要锁机制
    2. 我认为,这取决于您的意愿。在.NET 中是单身
    3. 我认为这不是 100% 适合提出问题的部分。

    【讨论】:

    • 至于 1. 我提到了synchronized,它提供了除 Vector 之外的一些锁定机制,例如线程安全集合。至于3.我在哪里可以找到提出这个问题的合适部分?
    猜你喜欢
    • 2021-12-19
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2011-07-31
    • 2011-03-11
    相关资源
    最近更新 更多