Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有导致性能问题的信号量的ExecutorService_Java_Multithreading_Threadpool_Semaphore - Fatal编程技术网

Java 带有导致性能问题的信号量的ExecutorService

Java 带有导致性能问题的信号量的ExecutorService,java,multithreading,threadpool,semaphore,Java,Multithreading,Threadpool,Semaphore,我有一个大约10人的服务池 在某些情况下,线程将需要一个具有3个许可证(连接到外部系统)的信号量 并非所有线程都需要执行此任务-因此,有时线程将在不需要外部系统连接的情况下完成 最后,线程执行器使用外部系统连接完成3个线程,还有7个线程等待获取连接 同时,还有20000多个线程等待完成任务,这些任务可能需要也可能不需要外部连接 这是对资源的浪费,因为其他20000个线程此时也可能正在执行 我已经考虑过这个问题,但找不到合适的解决方案(可能是因为我缺乏并发库方面的经验) 几点关键注意事项: 在执

我有一个大约10人的服务池

某些情况下,线程将需要一个具有3个许可证(连接到外部系统)的信号量

并非所有线程都需要执行此任务-因此,有时线程将在不需要外部系统连接的情况下完成

最后,线程执行器使用外部系统连接完成3个线程,还有7个线程等待获取连接

同时,还有20000多个线程等待完成任务,这些任务可能需要也可能不需要外部连接

这是对资源的浪费,因为其他20000个线程此时也可能正在执行

我已经考虑过这个问题,但找不到合适的解决方案(可能是因为我缺乏并发库方面的经验)

几点关键注意事项:

  • 在执行之前,无法确定线程是否需要外部系统连接

  • 外部系统连接需要作为线程事务的一部分执行。换句话说,没有可预见的方法从线程中删除此工作组件并创建单独的线程池


那么,有没有一种方法可以允许7个线程执行其他任务,而3个线程使用到另一个系统的连接,并且X个线程正在等待该连接

你的代码看起来像什么?你已经试过什么了?您是否考虑过使用两个独立的
ExecutorService
s?您需要在阻塞之前将任务添加到另一个池中。如果你不知道你的代码在做什么,你就不能编写一个能解决这个问题的类。<代码>有一种方法,我可以让7个线程执行其他任务< /代码>:它们正在执行其他任务,即他们正在等待获得被阻塞的资源。然而,由于代码有时需要完成外部系统连接,我无法确定如何定义哪个线程将属于哪个ExecutorService。彼得:抱歉搞混了,我知道这7个线程正在做一些事情,但是它们没有执行任何实际的工作-它们只是被阻塞了。同时,我可以完成其他线程,而不仅仅是等待。