在Java中创建FixedThreadPool Executor对象时,您需要传递一个参数,该参数描述Executor可以并发执行的线程数.我正在建立一个服务类,负责处理大量的电话号码.对于每个电话号码,我需要执行Web服务(这是我的瓶颈),然后在hashmap中保存响应.
为了使这个瓶颈对我的服务性能的危害减少,我决定创建一个Worker类来获取未处理的元素并处理它们.Worker类实现了Runnable接口,我使用Executor运行Workers.
可以在同一时间运行的Worker数量取决于Executor FixedThreadPool的大小.ThreadPool的安全大小是多少?当我用一些大数字作为参数创建FixedTheradPool时会发生什么?
我环顾四周但没有找到答案,所以我想确认一下.
假设我有一个固定大小的线程池 - ExecutorService pool = Executors.newFixedThreadPool(5);
我有一些代码:
pool.execute(new Runnable(){
try{
Object waitForMe = doSomethingAndGetObjectToWaitFor();
waitForMe.wait();
doSomethingElse();
}catch(Exception e){ throw new RunTimeException(e) }
});
Run Code Online (Sandbox Code Playgroud)
让我们假设上面的代码被称为几百次.池中只有5个线程(因此上述语句中只有5个应该在一个点上存在).还假设wait()在一个对象上对一个thrid方做了一些I/O调用,并在操作完成时等待回调,所以它自然需要一段时间才能完成.
现在我的问题是当其中一个任务到达a时的行为是什么wait(),任务是否进入休眠状态,然后线程池中的线程从队列中取出另一个任务并开始运行它?
如果正在等待的任务进入睡眠状态,当它获得notify()并唤醒时会发生什么?线程是否返回到线程池的队列(前面或后面)并等待,直到5个线程中的一个可以继续执行它(即调用doSomethingelse())?或者正在执行它的线程是否也进入休眠状态,即5个执行程序线程中的一个正在等待任务(这是我假设的)?或者执行程序线程是否接受另一个任务,并在第一个任务从wait()返回时被中断?
我一直在寻找一个简单的python线程池模式的良好实现,真的找不到任何适合我的需求.我正在使用python 2.7,我发现的所有模块都不起作用,或者没有正确处理工作程序中的异常.我想知道是否有人知道可以提供我正在搜索的功能类型的库.非常感谢.
我的第一次尝试是使用内置multiprocessing模块,但由于这不使用线程而是使用子进程,而是遇到了无法对对象进行pickle的问题.不要去这里
from multiprocessing import Pool
class Sample(object):
def compute_fib(self, n):
phi = (1 + 5**0.5) / 2
self.fib = int(round((phi**n - (1-phi)**n) / 5**0.5))
samples = [Sample() for i in range(8)]
pool = Pool(processes=8)
for s in samples: pool.apply_async(s.compute_fib, [20])
pool.join()
for s in samples: print s.fib
# PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)
所以,我看到有一些的蟒蛇3.2凉爽的并发功能回到端口这里.这似乎完美且易于使用.问题是,当你在一个工人一个例外,你只能得到异常的类型,比如"ZeroDivisionError",但没有回溯,因此没有迹象表明其中线导致异常.代码变得无法调试.不行.
from concurrent import futures
class Sample(object):
def compute_fib(self, n):
phi = (1 + 5**0.5) …Run Code Online (Sandbox Code Playgroud) 我已将线程池的大小限制为25.
process.env.UV_THREADPOOL_SIZE = 25;
Run Code Online (Sandbox Code Playgroud)
如何知道所有线程在运行时都已耗尽?
有没有办法发现在新请求期间所有定义线程都已耗尽?
我正在使用Native Abstractions for Node.js(NAN)来调用C++函数.对于C++的每个请求都创建了Nan :: AsyncQueueWorker.在这里,我想查找线程限制是否已用尽,然后添加安全系数.
我有一个在tomcat中运行的Web应用程序,我正在使用ThreadPool(Java 5 ExecutorService)并行运行IO密集型操作以提高性能.我想让每个池化线程中使用的一些bean都在请求范围内,但ThreadPool中的Threads无法访问spring上下文并获得代理失败.关于如何为ThreadPool中的线程提供弹簧上下文以解决代理失败的任何想法?
我猜测必须有一种方法来注册/取消注册ThreadPool中的每个线程,每个任务使用spring,但是没有任何运气找到如何做到这一点.
谢谢!
是否可以使用boost的线程创建线程池?我正在寻找所有的升级库,我找不到线程池管理器(或类似的东西)......有没有办法做到这一点?
TNX!
我想创建一个线程池,它将执行最近提交的任务.关于如何实现这一目标的任何建议?
谢谢
符合这个问题:如何获得线程的堆栈跟踪
我想知道是否有人可以指出有关解释提取的Java线程堆栈的信息jstack.
我的情况是我有一个在GlassFish v2.1.1上运行的Java EE 5应用程序,它定期挂起(每天至少2-3次).要让它再次运行,我必须杀死Glassfish进程并再次启动域.应用程序通常会变得越来越慢,直到它最终完全挂起.一旦挂起,我就无法获得线程堆栈.我已经能够获得一个线程堆栈,因为它越来越慢,但我看不到找到问题或挂起的线程.
这是最新的线程转储:http://issues.i2m.dk/attachments/66/threadstack.201103211046.txt
线程转储片段:
"p: thread-pool-1; w: 20" daemon prio=10 tid=0x00007efd18843800 nid=0x5f89 in Object.wait() [0x00007efd03381000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00007efd480fc228> (a com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl)
at com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl.requestWork(WorkQueueImpl.java:171)
- locked <0x00007efd480fc228> (a com.sun.corba.ee.impl.orbutil.threadpool.WorkQueueImpl)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:528)
"TP-Processor83" daemon prio=10 tid=0x0000000043179000 nid=0x5f87 runnable [0x00007efd03583000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x00007efe72696090> (a java.io.BufferedInputStream)
at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:607)
at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:545)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:672)
at …Run Code Online (Sandbox Code Playgroud) 是否存在线程池(在Java中)的任何实现,以确保在同一线程上执行相同逻辑ID的所有任务?
我所追求的逻辑是,如果在给定逻辑ID的特定线程上已经执行了任务,则在同一线程上安排具有相同ID的新任务.如果没有线程为同一ID执行任务,则可以使用任何线程.
这将允许并行执行不相关ID的任务,但是同一ID的任务将以串行和提交的顺序执行.
如果没有,是否有任何关于如何扩展ThreadPoolExecutor以获得此行为的建议(如果可能的话)?
UPDATE
花了更长时间考虑这个问题,我实际上并不要求在同一个线程上执行相同逻辑ID的任务,只是它们不会同时执行.
这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能同一个客户(并且必须按顺序处理同一客户的所有订单).
我现在采用的方法是使用标准的ThreadPoolExecutor,自定义BlockingQueue并Runnable使用自定义包装器进行包装.的Runnable包装器逻辑是:
ConcurrentHashMap)以查看当前是否正在运行相同ID的任务
然后,队列的poll()方法只返回具有当前不在"运行"集中的ID的任务.
这样做的问题在于,我确信会有很多我没有想过的极端情况,因此需要进行大量的测试.
在Java程序中使用Executors而不仅仅是Threads有什么好处.
如
ExecutorService pool = Executors.newFixedThreadPool(2);
void someMethod() {
//Thread
new Thread(new SomeRunnable()).start();
//vs
//Executor
pool.execute(new SomeRunnable());
}
Run Code Online (Sandbox Code Playgroud)
执行程序是否仅限制允许一次运行的线程数(线程池)?它是否实际上将runnable复用到它创建的线程上?如果不是,它只是一种避免每次都必须编写新的Thread(runnable).start()的方法吗?
threadpool ×10
java ×7
concurrency ×2
boost ×1
boost-thread ×1
c++ ×1
c++11 ×1
debugging ×1
glassfish ×1
javascript ×1
node.js ×1
python ×1
spring ×1
spring-mvc ×1
web-services ×1