Tag: threadpool

JMS和ThreadPool有问题吗?

我希望当一个线程处理完一条消息(threadPool提交一个可调用的)时,jms会收到一条消息。 消息由主线程接收。 以下哪种方式更好: 我使用spring 3.0.5: ApplicationContext context = new ClassPathXmlApplicationContext( “application-context.xml”); jmsTemplate = (JmsTemplate) context.getBean(“jmsTemplate”); destination = (Destination) context.getBean(“destination”); _log4j.debug(“ThreadSize in xml\t” + appConfig.getThumbCreatorThreadSize()); 在主线程中方式1: while (countFlag < 0) { try { TextMessage msg = (TextMessage) jmsTemplate .receive(destination); // prehandle ,then give to sub workers. if (msg != null) { _log4j.debug("JMSMessageID:\t" + msg.getJMSMessageID() + "\t" […]

如何以multithreading方式调用不同类的相同方法

我在我的两个类中有一个名为process的方法,比如说CLASS-A and CLASS-B 。 现在在下面的循环中,我调用我的两个类的process method顺序意义一个接一个,它工作正常,但这不是我想要的方式。 for (ModuleRegistration.ModulesHolderEntry entry : ModuleRegistration.getInstance()) { final Map response = entry.getPlugin().process(outputs); // write to database System.out.println(response); } 有什么办法,我可以用multithreading方式调用我的两个类的进程方法。 这意味着一个线程将调用CLASS-A的进程方法,第二个线程将调用CLASS-B的进程方法。 之后我想将process方法返回的数据写入数据库。 所以我可以再写一个线程来写入数据库。 下面是我以multithreading方式提出的代码,但不知何故它根本没有运行。 public void writeEvents(final Map data) { // Three threads: one thread for the database writer, two threads for the plugin processors final ExecutorService executor = Executors.newFixedThreadPool(3); final […]

如何实现在执行结束时自动关闭的线程池?

我正在编写一个理论上可以在不同环境中使用的Java客户端:Java main(),servlet容器或dependency injection。 客户端实现内部连接线程池。 这种方法的问题在于,客户端的用户不知道实现内部线程池的事实将使他或她的应用程序在关闭时“挂起”。 我的用户需要知道向库发送shutdown()消息。 我想知道是否可以采取任何其他替代方法,一方面,允许我为我的连接启动一个线程池; 而且,另一方面,捕获一些事件,可能是一个JVM事件,表明JVM正在关闭,这将允许我调用我的shutdown()实现。

Tomcat活动线程堆积并停止服务器

我们的生产服务器(apache-tomcat-7.0.6)遇到了这个问题,它使用MySQL作为DB运行Spring-JPA-Hibernate应用程序。 在此问题期间,服务器变得缓慢,并且在一分钟内它变得没有响应,活动的tomcat线程数量最多可以达到200(我们使用javamelody来观察这些事情)。 日志看起来像: 2012-04-07 07:53:48,058 DEBUG AuthenticationHandler:(“http-bio-7006”-exec-304):35 – Authentication handler : ~ 2012-04-07 07:53:48,059 DEBUG AuthenticationHandler:(“http-bio-7006”-exec-304):45 – Service Id : 1333765428059-/xxx-framework-service/platform/items/search/ 2012-04-07 07:53:48,060 DEBUG DefaultListableBeanFactory:(“http-bio-7006”-exec-304):242 – Returning cached instance of singleton bean ‘transactionManager’ 2012-04-07 07:53:48,060 DEBUG JpaTransactionManager:(“http-bio-7006″-exec-304):365 – Creating new transaction with name [com.xxx.framework.manager.ItemManager.search]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ” 2012-04-07 07:53:48,060 DEBUG JpaTransactionManager:(“http-bio-7006”-exec-304):323 – Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@6aee43a9] […]

newFixedThreadPool()vs newCachedThreadPool()

如果newCachedThreadPool()根据需要创建一个线程池,根据需要创建新线程,但是在它们可用时将重用先前构造的线程,而在newFixedThreadPool(int size)情况下,指定大小以创建指定大小的线程池。 为什么newFixedThreadPool(int size)不是以newCachedThreadPool()方式实现的,其中线程池仅在需要时创建新线程并将线程限制为大小? 对上述内容的任何澄清都非常有用。

Java执行器和每线程(不是每个工作单元)对象?

我的任务将受益于线程池设计模式(许多小任务要并行执行)。 我最初从头开始实现一个天真的线程池,n个Runnables都从同一个ConcurrentLinkedQueue拉出工作单元,直到队列为空,然后终止。 然后我决定“嘿,让我们尝试Java中的Executor,因为这可能比我天真设计的系统更好地测试和更可靠。” 问题:在我的实现中,每个线程持续到队列为空,使用while (!queue.isEmpty()) ,并获得自己的非线程安全对象实例,让我们称之为SlowObject foo ,这很耗时构建。 尝试传递进入Executor池的所有Runnable ,时间效率低的对象的实例失败,因为它不是线程安全的。 为每个Runnable创建SlowObject的新实例是不可取的,因为它们构造成本SlowObject 。 有没有办法说“我们使用了多少线程?让我们为每个线程创建一个SlowObject ,然后让Runnables检测我们所在的线程并查找要使用的正确对象?” 这听起来很脆弱且容易出错 – 但不确定我应该看哪种设计模式。

我该如何解决MongoWaitQueueFullException?

我运行一个java程序,它是一个线程执行程序,它将数千个文档插入mongodb中的表。 我收到以下错误 Exception in thread “pool-1-thread-301” com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 500 has been exceeded. at com.mongodb.PooledConnectionProvider.get(PooledConnectionProvider.java:70) at com.mongodb.DefaultServer.getConnection(DefaultServer.java:73) at com.mongodb.BaseCluster$WrappedServer.getConnection(BaseCluster.java:221) at com.mongodb.DBTCPConnector$MyPort.getConnection(DBTCPConnector.java:508) at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:456) at com.mongodb.DBTCPConnector.getPrimaryPort(DBTCPConnector.java:414) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:176) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:159) at com.mongodb.DBCollection.insert(DBCollection.java:93) at com.mongodb.DBCollection.insert(DBCollection.java:78) at com.mongodb.DBCollection.insert(DBCollection.java:120) at ScrapResults103$MyRunnable.run(MyProgram.java:368) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at […]

即使在Websphere中停止应用程序后,线程仍会继续运行

我有一个长期运行的线程,使用org.springframework.scheduling.commonj.WorkManagerTaskExecutor和Spring创建,并在Websphere Application Server 8中运行。 问题是即使应用程序已停止,此线程仍会继续运行。 该线程也需要停止,但它没有发生。 我甚至尝试使用Thread.currentThread().isInterrupted()来检查当前线程是否被中断但它总是返回false 。 所以没有办法通过我的代码知道线程应该继续运行还是停止。 这是我对WorkManagerTaskExecutor的弹簧配置: 线程正在以这种方式执行: Thread t = new EmailReaderThread(email); workManagerTaskExecutor.execute(t); 我错过了什么? 我能做什么,每当应用程序停止时,应用程序的线程(应用程序生成的线程)也会停止? 我认为这不被视为非托管线程,因为我使用适当的WorkManager注册线程,容器由JNDI作为资源公开。 更新:这是创建线程的代码。 @Service @Transactional public class SmsServiceHypermedia implements SmsService { @Autowired private WorkManagerTaskExecutor workManagerTaskExecutor; public SmsServiceHypermedia() { createEmailReaderThread(); } private void createEmailReaderThread() { log.debug(“Generating Email Reader Threads…”); Email email = getDefaultEmail(); //obtain the default Email object, […]

在JavaEE EJB / Web容器中创建线程

我在Adam Bien的JavaEE夜间黑客书中读到,虽然EJB容器上禁止创建线程,但Web容器却不是这样。 他实际上在他的X射线探测器中创建了一个线程池执行器,它在Tomcat上运行。 我现在有点困惑。 虽然我遇到了必须在EE应用程序中进行手动线程池管理的情况,但我可以理解为什么在JavaEE容器中手动创建线程是个坏主意。 但是,当您可以将大部分EJB部署到任何一个EJB容器时,我不理解EJB容器和Web容器之间的区别。 如果会话bean在Web容器中生成线程没有任何问题,那么将相同的会话bean部署到EJB容器可能会导致什么问题?

Threadpool中的Threadlocal内存泄漏

我在Tomcat中收到threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的webapp中没有ThreadLocal的实现。 严重:Web应用程序[/ myWebApp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.DateUtils $ DateFormatHolder $ 1](value [org.apache.http.imp l.cookie.DateUtils $ DateFormatHolder $ 1 @ 4c2849])和类型为[java.lang.re f.SoftReference]的值(值[java.lang.ref.SoftReference@1e67280])但在Web应用程序停止时无法重新调用它。 线程将会更新并且有时间尝试避免可能的内存泄漏。 我不明白为什么我得到线程局部错误,虽然我没有实现它? 我想摆脱这些消息,所以我搜索了网络,并在这里写道,为了清理threadlocal我需要使用: ThreadLocal.remove() 但我没有ThreadLocal的实现..如果有人给我指路,我将不胜感激。