Pooling threads

I know the Doug Lea util.concurrent package, and there is a thread pool implementation. I also know some apps that use thread pools.
But the Thread class doesn't allow running more than one instance of a runnable... and it's not possible to change the runnable instance in a Thread once it'was created. I think you can run it twice (after it stopped, but never tried).
So how do you implement a thread pool in java? As far as I know, the Doug Lea's pool creates a new thread every time, it only limits the maximun amount of threads, am I right?

The trick is to wrap Runnable with another inner Runnable.
Basically:
You have a queue, and bunch of threads whose runnables have settable inner runnables.
1. While a Thread's Runnable's inner runnable is null it waits...
2. You put a runnable on the queue.
3. It waits for the next available thread, removes it from the pool, sets it's runnables inner runnable to the one you actually want to run.
4. Stuff happens...
5. When the runnable is finished executing your runnable it adds the thread back to the pool.

Similar Messages

  • Socket in pooled thread

    I am using a ExecutorService (fixed thread pool) for client threads. Every client thread creates a socket connection. I was wondering if there is a way to keep the socket connection open for every pooled thread or if I have to have an extra pool for those socket connections.

    Yes, just put it somewhere where the Runnables can find it.

  • Adjusting Pool Threads

    Just to be sure... Adjusting the Pool Threads should increase the performance on the IIS server?
    And it's recommended to set it to twice the amount of devices.
    It is not there by default, so you have to create it. The default is 2 x MB of RAM eg. 4GB =
    PoolThreadLimit = 8000. So I should not change this setting, right? Unless I manage over 4000 devices?
    One more thing; from what I can see in the IIS docs the limit is 256, is this true? Because another site says
    "Range: 0 - 4,294,967,295 (unlimited)"
    So if the first one is true is should give nothing to set this reg key. A bit confused right now... ;-)
    I guess it's the last one that's the right one.
    So maybe this is the case: it's used as some kind of limit to make sure ZMM does not kill the IIS?
    Niels

    I think it's all pretty straighforward. You just need a request queue (probably a linked list) which contains Runnable objects. Then you fire up as many threads as you want, each thread waits for requests to become available and performs them. On 1.4 you have to make your own BlockingQueue but that's pretty easy. Use a LinkedList
    Your pooled thread just does something like
    public void run() {
        try {
          while(!Thread.currentThread().isIntererupted()) {
             Runnable request = null;
             synchronized requestQueue {
                   while(requestQueue.isEmpty())
                      requestQueue.wait();
                     request = requestQueue.removeFirst();
            request.run();
        } catch(InterruptedException e)  {
           // normal shutdown
      }(Though it might be wise to add some stuff to handle unchecked exceptions from the request).

  • Using AsyncEventHandlers as a RTJ buildin thread pool

    Hi David
    1. I would like to use AsyncEventHandler mechanism as a thread pool. Would there be a way in future version to access the AsyncEventHandler's RT Thread pool API ?
    2. I am using the BoundAsyncEventHandler for long duration task (since the BoundAsyncEventHandler is bound to a specific Thread) - Would there be a way in future version to bound a specific RT Thread to this handler ? - for example a RT Thread that was created by my own Thread pool ?
    Thanks

    Gabi wrote:
    1.We need our code to access the AEH's "thread pool" and check the pool's availability; increase/decrease the pool size dynamically; check pool size for enough free threads to run any given number of tasks and so on...There are no API's for this. How a VM supports AEH execution is an implementation detail, and while a "pool" is the logical form of implementation the details can vary significantly so there's no real way to define an API to control it without defining what form it must take. For example in Java RTS the pool threads are initially at the highest system priority and then drop down to the priority of the AEH they execute. In a different design you might have a pool of threads per priority level (or set of priority levels) so even the notion of increasing/decreasing the pool size is not necessarily straight-forward. In Java RTS the pool will grow as needed to service outstanding AEH activations. You can control the initial number of threads - and there are two pools: one of heap-using and one for non-heap AEH.
    2. I was thinking about adding the BAEH class with the next method:
    void setBoundThread(RTThread t) throws IllegalArgumentExceptionand also in the Ctor add the RTThread as a parameter.
    Inside this method, the thread should be check if started and is so should throw an IllegalArgumentException.Sure, but why do you need to do this? What is different about the RTT that you pass in? The thread executing an AEH acquires the characteristics of the AEH.
    An API like this raises some questions such as: when would the thread be started? It also has a problem in that the run() method of the thread has to know how to execute an AEH, which means we'd (the RTSJ expert group) probably have to define a class BoundAEHThread that has a final run() method and you'd then subclass it.
    3. Additional question, what do you think about using lock (CountdownLatch) during the AEH's executions ?
    I've seen somewhere that AEH should only be used for short live tasks - is it true ? (in the JavaDoc it says there is no problem doing so but I want to be sure)If an AEH blocks for any length of time and additional AEH are activated then the pool management overhead may increase (unless you already sized it appropriately). But otherwise there's no restriction on what the code in an AEH can do. But note that none of the java.util.concurrent synchronization tools support priority-inversion avoidance, so you need to be careful if using them (ie only use them across threads of the same priority and don't expect FIFO access).
    David Holmes

  • Thread pool library

    Hello all,
    Does anybody know an open-source library that provides a thread pool with the following behavior?
    When a task is submitted...
    if (there are idle threads in the pool) {
        use an idle thread to execute the task.
    } else {
        if (currentThreadCount < maximumPoolSize) {
            create new thread to execute the task.
        } else {
            put the task in the queue.
            (tasks in the queue will be processed when threads are available).
    }If a thread remains idle for X time, it dies.
    Thank you

    I ran your code and it ran it just fine, I prefixed your println to print out the currentTimeMillis to show it ran right after each other.
    System.out.println(System.currentTimeMillis() +  "{code}
    Here is the result:
    1244482518471 Starting main.
    1244482518483 Running a task
    Here is code fragments from ThreadPoolExecutor I generated my sudo code from.
    {code}
         * Executes the given task sometime in the future.  The task
         * may execute in a new thread or in an existing pooled thread.
         * If the task cannot be submitted for execution, either because this
         * executor has been shutdown or because its capacity has been reached,
         * the task is handled by the current <tt>RejectedExecutionHandler</tt>.
         * @param command the task to execute
         * @throws RejectedExecutionException at discretion of
         * <tt>RejectedExecutionHandler</tt>, if task cannot be accepted
         * for execution
         * @throws NullPointerException if command is null
        public void execute(Runnable command) {
            if (command == null)
                throw new NullPointerException();
            if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
                if (runState == RUNNING && workQueue.offer(command)) {
                    if (runState != RUNNING || poolSize == 0)
                        ensureQueuedTaskHandled(command);
                else if (!addIfUnderMaximumPoolSize(command))
                    reject(command); // is shutdown or saturated
         * Creates and starts a new thread running firstTask as its first
         * task, only if fewer than corePoolSize threads are running
         * and the pool is not shut down.
         * @param firstTask the task the new thread should run first (or
         * null if none)
         * @return true if successful
        private boolean addIfUnderCorePoolSize(Runnable firstTask) {
            Thread t = null;
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                if (poolSize < corePoolSize && runState == RUNNING)
                    t = addThread(firstTask);
            } finally {
                mainLock.unlock();
            if (t == null)
                return false;
            t.start();
            return true;
         * Rechecks state after queuing a task. Called from execute when
         * pool state has been observed to change after queuing a task. If
         * the task was queued concurrently with a call to shutdownNow,
         * and is still present in the queue, this task must be removed
         * and rejected to preserve shutdownNow guarantees.  Otherwise,
         * this method ensures (unless addThread fails) that there is at
         * least one live thread to handle this task
         * @param command the task
        private void ensureQueuedTaskHandled(Runnable command) {
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            boolean reject = false;
            Thread t = null;
            try {
                int state = runState;
                if (state != RUNNING && workQueue.remove(command))
                    reject = true;
                else if (state < STOP &&
                         poolSize < Math.max(corePoolSize, 1) &&
                         !workQueue.isEmpty())
                    t = addThread(null);
            } finally {
                mainLock.unlock();
            if (reject)
                reject(command);
            else if (t != null)
                t.start();
    {code}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  • Thread Pool in JRT

    Hi All,
    1) the first question is what is the recommended way to allocate thread poll in rt system??
    2) what is the best way to do:
    -if my mission take a long time can i just suspend the thread and than resume it again (is it possible at all??)
    or the other option is to return it to the pool and get it again and again.
    im asking the second question from the view of performance and low latency .
    i assumed that each time i return the thread to the pool and than active it again it will "cost" cpu time.
    hope my question is clear enough.
    TIA
    Gabi

    Hi Gabi,
    I'm not completely clear on your questions. You can create a thread pool in a RT system the same basic way as in non-RT but you need to deal with priorities correctly. One way to do this would be to have the pool threads run at maximum priority normally and then drop to the actual priority of a submitted work task. Another model is to split the pool into groups based on priority, so effectively there is a work queue per priority-level and a group of threads to service each pool. This second model is used in the Real-time CORBA "lanes" approach. Designing an effective thread pool is a non-trivial task (take a look at the java.util.concurrent Thread PoolExecutor) and dealing with RT priorities and RT latency issues makes it even more complex.
    Alternatively rather than use an explicit thread pool consider whether you can convert the design to one using AsyncEvents and AsyncEventHandlers.
    Question 2 I don't really understand. Pool threads typically block on a queue waiting for work tasks to appear. But you can also have a non-terminating task that effectively picks up its own work from elsewhere - eg a task that reads from a socket to get the next "job" to process. Any interaction between threads is going to cost CPU time, whether a pool is involved or not, but yes there will be overhead associated with a pool, just as there is starting and terminating a thread, or performing any kind of thread coordination/synchronization.
    Regards,
    David Holmes

  • Aplication server thread pool problem

    I'm using sun app server 8.
    After some time from starting (and using) the server, it stops responding to clients.
    When I change the max number of threads on server the number of clients it can serve before hanging folows the change. So I guess that some threads are not recycled.
    But, I can't get full thread dump to see what's happening.
    Also I can't get any thread pool monitoring information through asadmin.
    (I can see that EJB's are all removed successfuly)
    Any suggestions.
    Thanks in advance.

    First of all, thank you for helping me.
    The client wasn't making problems, but server did. (I didn't said that I use the app. server on XP.)
    For now I solved the problem by installing the new beta 2004Q4. It works fine now, it also has some thread monitoring in web console...
    I was getting this, when I tried to monitor the thread-pool (it is set on HIGH):
    asadmin> get -m server.thread-pools.thread-pool.thread-pool-1.*
    No matches resulted from the wildcard expression.
    CLI137 Command get failed.
    If it means anything this is what I was getting when I do ctrl-break. (this thread dump stays the same even after server stops responding...)
    Full thread dump Java HotSpot(TM) Client VM (1.4.2_04-b04 mixed mode):
    "Thread-6" prio=5 tid=0x02edad08 nid=0xb40 runnable [331f000..331fd8c]
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:177)
    at org.apache.commons.launcher.StreamConnector.run(StreamConnector.java:
    115)
    "Thread-5" prio=5 tid=0x02ebbb98 nid=0x8ac runnable [32df000..32dfd8c]
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:194)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:220)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:277)
    - locked <0x10089900> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(FilterInputStream.java:90)
    at org.apache.commons.launcher.StreamConnector.run(StreamConnector.java:
    115)
    "Signal Dispatcher" daemon prio=10 tid=0x0093dc18 nid=0x930 waiting on condition
    [0..0]
    "Finalizer" daemon prio=9 tid=0x008a5c20 nid=0xbd0 in Object.wait() [2b5f000..2b
    5fd8c]
    at java.lang.Object.wait(Native Method)
    - waiting on <0x10502a00> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
    - locked <0x10502a00> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
    "Reference Handler" daemon prio=10 tid=0x008a47f0 nid=0xb4 in Object.wait() [2b1
    f000..2b1fd8c]
    at java.lang.Object.wait(Native Method)
    - waiting on <0x10502a68> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:429)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115)
    - locked <0x10502a68> (a java.lang.ref.Reference$Lock)
    "main" prio=5 tid=0x000362a0 nid=0xc38 runnable [7f000..7fc3c]
    at java.lang.Win32Process.waitFor(Native Method)
    at org.apache.commons.launcher.LaunchTask.execute(LaunchTask.java:705)
    at org.apache.tools.ant.Task.perform(Task.java:341)
    at org.apache.tools.ant.Target.execute(Target.java:309)
    at org.apache.tools.ant.Target.performTasks(Target.java:336)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1339)
    at org.apache.commons.launcher.Launcher.start(Launcher.java:402)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at LauncherBootstrap.main(LauncherBootstrap.java:185)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at com.sun.enterprise.admin.servermgmt.pe.PEInstancesManager.startInstan
    ce(PEInstancesManager.java:115)
    at com.sun.enterprise.admin.servermgmt.pe.PEDomainsManager.startDomain(P
    EDomainsManager.java:126)
    at com.sun.enterprise.cli.commands.StartDomainCommand.runCommand(StartDo
    mainCommand.java:59)
    at com.sun.enterprise.cli.framework.CLIMain.invokeCommand(CLIMain.java:1
    23)
    at com.sun.enterprise.cli.framework.CLIMain.main(CLIMain.java:39)
    "VM Thread" prio=5 tid=0x0093c698 nid=0x9b4 runnable
    "VM Periodic Task Thread" prio=10 tid=0x00940438 nid=0xbd4 waiting on condition
    "Suspend Checker Thread" prio=10 tid=0x0093d2b8 nid=0x2c0 runnable

  • Basics of Thread Pool and MDB

    Hi,
    I am not able to connects the dots between Self-Tuning Thread Pool Threads ,number of MDB's and Open connection to Queue Manager (Listeners).
    Following is my setting
    1 Self-Tuning Thread Pool : Default i.e 5
    2) Initial Beans in Free Pool: 100
    3) Max Beans in Free Pool : 200
    What i see
    Pool Current Count :- 100 (this is as expected)
    On start up of server 105 MDB's are created (No problem with this ) (Have put static variable incrementing in constructor)
    When Messages are sent to MQ (50-100) the "Beans In Use Count" under Monitoring never shows more then 16
    and finally the "open MQ Count" on MQ Explorer is always 16.
    Questions.
    1) What do i need to change, for increasing the count of "Beans In Use Count" and "open MQ Count" on MQ Explorer to be more than 16?
    2)If the Self-Tuning thread pool is 5, how come 16 beans are executed at once? or its just that 16 are picked from pool and only 5 are executed at given time?
    NOTE:- I am using weblogic app server to connecto IBM MQ with JMS Module, so creating the customer WorkManager and attaching it to my listener (MDB) is not supported by weblogic, it says the mdb is not under webloic thread pool so this settingt will have no effect
    -thnaks

    Hi ,
    You have to create a custom work manager and then you have to associate this customer work manager to the dispatch policy of the MDB to increase the threads.
    Following links would surely help you as TomB has explained the same issue very well, do have a look at them.
    Re: WorkManager Max thread constraints not applied to MDB
    Also you can also go through this links which would help you get more information:
    Topic: Configuring Enterprise Beans in WebLogic Search for "To map an EJB to a workmanager"
    http://middlewaremagic.com/weblogic/?p=5665
    Topic: WebLogic WorkManager with EJB3 And MaxThread Constraint
    http://middlewaremagic.com/weblogic/?p=5507
    Regards,
    Ravish Mody
    http://middlewaremagic.com/weblogic/
    Come, Join Us and Experience The Magic…

  • How can i get the stack of one thread from another thread

    hi !
    i have a pool threads ,some times all therads in that pool are besy becouse somting lock the threads so there is no free thread to handle ... .
    what i want is a way to get the stack of these thread so i can print them to see way they lock ...
    thanks,
    zvika

    Maybe something like this (haven't actually tried it):
    Add a method to your Threads to print the trace:
    public class MyThread extends Thread {
        public void run() {
        public void printCurrentStack() {
            (new Exception()).printStackTrace(); // or whatever method you choose
    MyThread mt = new MyThread();
    mt.start();
    mt.printCurrentStack();

  • WLS 10.3.0.0 Solaris SPARC and DBMS Oracle 10gR2 connection pooling issue

    Hi all,
    we are currently testing Weblogic Server 10.3.0.0 in order to migrate our production system from WLS 8.1 to it.
    While testing the new setup, we encountered some strange behaviour of the connection pooling within WLS.
    We configured a XA-Connection pool to our DB (Oracle 10gR2) by using
    a) the Oracle XA-thin-driver delivered within WLS 10.3.0.0
    and alternatively
    b) the Oracle 11.2.0.2 OCI-driver of the Oracle 11g database client.
    We´ve got the same issue with both variants. We defined an initial capacity of 5 connections and a maximum capacity of 30 connections.
    Our application is running flawlessly using the connection pool, but the amount of active sessions between the application server and the database server is increasing rapidly and the maximum capacity is exceeded. We are seeing up to multiple hundreds of sessions from the application server to our database server. Obviously the connections aren´t cleaned up.
    We are using the following settings for the JDBC-Connection:
    initial capacity = 5
    max. capacity = 30
    Capacity increment = 1
    Statement cache type = LRU
    Statement cache size = 10
    Test connections on reserve = true
    Test frequency = 120
    Test table name = "sql select 1 from dual"
    seconds to trust an idle pool connection = 10
    shrink frequency = 0
    connecttion creation retry frequency = 120
    login delay = 0
    incative connection timeout = 10
    max. waiting for connection = 2147483647
    connection reserve timeout= = -1
    Ignare in-use connections = true
    pinned-to-thread = false
    remoce infected connections enabled = true
    Does anyone have an idea how to track/solve this issue?
    Kind regards
    Marc

    Hi Joe,
    we´ve tested with the thin driver using an initial capacity of 5 and a maximum capacity of 15. During our tests (in a very short time period) the maximum capacity has not been exceeded. But we saw some exceptions in the managed server logfile which made us curious.
    When these exceptions are occuring, a new connection to the database server is established. We are seeing for a short time a total count of 6 connections which is immediately decreasing to the initial capacity of 5. We will do some further testing over the next hours and monitor the connection usage.
    The connection we are dealing with is the one called "ZDB2".
    This is an excerpt of the logfile:
    ####<18.10.2010 19:45 Uhr MESZ> <Debug> <JDBCConn> <SERVER-NAME> <MANAGED SERVER NAME> <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <BEA1-02F7EA174F1D84653A69> <> <1287423940610> <BEA-000000> <java.lang.Exception: Pinned: autoCommit=true,enabled=true,isXA=true,isJTS=false,vendorID=0,connUsed=true,doInit=false,'null',destroyed=false,poolname=ZDB2,appname=null,moduleName=null,connectTime=177,dirtyIsolationLevel=false,initialIsolationLevel=2,infected=true,lastSuccessfulConnectionUse=1287423940605,secondsToTrustAnIdlePoolConnection=10,currentUser=java.lang.Exception
         at weblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:308)
         at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:314)
         at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:427)
         at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:316)
         at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:93)
         at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:61)
         at weblogic.jdbc.jta.DataSource.getXAConnectionFromPool(DataSource.java:1473)
         at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1272)
         at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:425)
         at weblogic.jdbc.jta.DataSource.connect(DataSource.java:382)
         at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:338)
         at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
         at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
         at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
         at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
         at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
         at org.hibernate.loader.Loader.doQuery(Loader.java:673)
         at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
         at org.hibernate.loader.Loader.doList(Loader.java:2220)
         at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
         at org.hibernate.loader.Loader.list(Loader.java:2099)
         at org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:912)
         at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
         at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
         at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
         at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:811)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderPersistenceGenerated.findByPrimaryKey(OrderPersistenceGenerated.java:45)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImplStandard.findOrderByPrimaryKey(OrderManagementServiceImplStandard.java:1356)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.findOrderByPrimaryKeyTx(OrderManagementServiceTransactionHandler.java:830)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceSessionBean.findOrderByPrimaryKey(OrderManagementServiceSessionBean.java:1276)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_ELOImpl.findOrderByPrimaryKey(OrderManagementEJB_yb2dzq_ELOImpl.java:19812)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceApplicationProxy.findOrderByPrimaryKey(OrderManagementServiceApplicationProxy.java:1289)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.findOrderByPrimaryKey(OrderManagementServiceTransactionHandler.java:823)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImplStandard.findOrderByPrimaryKey(OrderManagementServiceImplStandard.java:1341)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.findOrderByPrimaryKeyTx(OrderManagementServiceTransactionHandler.java:816)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceSessionBean.findOrderByPrimaryKey(OrderManagementServiceSessionBean.java:1255)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_ELOImpl.findOrderByPrimaryKey(OrderManagementEJB_yb2dzq_ELOImpl.java:7332)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceApplicationProxy.findOrderByPrimaryKey(OrderManagementServiceApplicationProxy.java:1266)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.findOrderByPrimaryKey(OrderManagementServiceTransactionHandler.java:809)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImpl.publishOrder(OrderManagementServiceImpl.java:1636)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImpl.savePublishedOrder(OrderManagementServiceImpl.java:1606)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.savePublishedOrderTx(OrderManagementServiceTransactionHandler.java:3467)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceSessionBean.savePublishedOrder(OrderManagementServiceSessionBean.java:5272)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl.savePublishedOrder(OrderManagementEJB_yb2dzq_EOImpl.java:3263)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.internalInvoke2(Unknown Source)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.internalInvoke1(Unknown Source)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.invoke(Unknown Source)
         at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
         at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:230)
         at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:477)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
         at weblogic.security.service.SecurityManager.runAs(Unknown Source)
         at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:473)
         at weblogic.rmi.internal.wls.WLSExecuteRequest.run(WLSExecuteRequest.java:118)
         at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
         at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
    ,currentThread=Thread[[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads],lastUser=null,currentError=null,currentErrorTimestamp=null,JDBC4Runtime=true,supportStatementPoolable=true,needRestoreClientInfo=false,defaultClientInfo={} is set to be refreshed
         at weblogic.jdbc.common.internal.ConnectionEnv.setRefreshNeeded(ConnectionEnv.java:518)
         at weblogic.jdbc.wrapper.Connection.getVendorConnection(Connection.java:292)
         at de.dpcom.persistence.hibernate.BinaryBlobType.nullSafeSet(BinaryBlobType.java:109)
         at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146)
         at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1997)
         at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2371)
         at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2307)
         at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2607)
         at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
         at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
         at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
         at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
         at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
         at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CertificatePersistenceGenerated.updateCertificate(CertificatePersistenceGenerated.java:116)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CustomerManagementServiceImplStandard.updateCertificate(CustomerManagementServiceImplStandard.java:1282)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CustomerManagementServiceTransactionHandler.updateCertificateTx(CustomerManagementServiceTransactionHandler.java:711)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CustomerManagementServiceSessionBean.updateCertificate(CustomerManagementServiceSessionBean.java:1104)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CustomerManagementEJB_ap2i9a_ELOImpl.updateCertificate(CustomerManagementEJB_ap2i9a_ELOImpl.java:19199)
         at APPNAME-ROOT-PATH.components.customermanagement.biz.CustomerManagementServiceApplicationProxy.updateCertificate(CustomerManagementServiceApplicationProxy.java:1101)
         at APPNAME-ROOT-PATH.components.productionresultprocessing.biz.ProductionResultProcessingServiceImpl.publishCertificate(ProductionResultProcessingServiceImpl.java:1131)
         at APPNAME-ROOT-PATH.components.productionresultprocessing.biz.ProductionResultProcessingServiceTransactionHandler.publishCertificateTx(ProductionResultProcessingServiceTransactionHandler.java:298)
         at APPNAME-ROOT-PATH.components.productionresultprocessing.biz.ProductionResultProcessingServiceSessionBean.publishCertificate(ProductionResultProcessingServiceSessionBean.java:517)
         at APPNAME-ROOT-PATH.components.productionresultprocessing.biz.ProductionResultProcessingServiceSessionBean_yaua6q_ELOImpl.publishCertificate(ProductionResultProcessingServiceSessionBean_yaua6q_ELOImpl.java:1804)
         at APPNAME-ROOT-PATH.components.productionresultprocessing.biz.ProductionResultProcessingServiceApplicationProxy.publishCertificate(ProductionResultProcessingServiceApplicationProxy.java:471)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImpl.publishCertificate(OrderManagementServiceImpl.java:1825)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImpl.publishOrder(OrderManagementServiceImpl.java:1664)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceImpl.savePublishedOrder(OrderManagementServiceImpl.java:1606)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceTransactionHandler.savePublishedOrderTx(OrderManagementServiceTransactionHandler.java:3467)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementServiceSessionBean.savePublishedOrder(OrderManagementServiceSessionBean.java:5272)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl.savePublishedOrder(OrderManagementEJB_yb2dzq_EOImpl.java:3263)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.internalInvoke2(Unknown Source)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.internalInvoke1(Unknown Source)
         at APPNAME-ROOT-PATH.components.ordermanagement.biz.OrderManagementEJB_yb2dzq_EOImpl_WLSkel.invoke(Unknown Source)
         at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
         at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:230)
         at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:477)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
         at weblogic.security.service.SecurityManager.runAs(Unknown Source)
         at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:473)
         at weblogic.rmi.internal.wls.WLSExecuteRequest.run(WLSExecuteRequest.java:118)
         at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
         at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
    >
    ####<18.10.2010 19:45 Uhr MESZ> <Info> <JDBC> <SERVER-NAME> <MANAGED SERVER NAME> <[ACTIVE] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1287423940797> <BEA-001072> <Connection for XA pool "ZDB2" created.>
    ####<18.10.2010 19:45 Uhr MESZ> <Info> <JDBC> <SERVER-NAME> <MANAGED SERVER NAME> <[ACTIVE] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1287423940808> <BEA-001132> <Initialized statement cache of size "10" for connection in pool "ZDB2".>
    ####<18.10.2010 19:45 Uhr MESZ> <Info> <Common> <SERVER-NAME> <MANAGED SERVER NAME> <[ACTIVE] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1287423940808> <BEA-000628> <Created "1" resources for pool "ZDB2", out of which "1" are available and "0" are unavailable.>
    Any suggestions?
    Kind regards
    Marc

  • Too many threads?

    Is there a such thing as using too many threads? I'm in the planning stages and it would be nice to have each object running on its own thread, but is this a horrible thing? Is there a general rule of thumb on the number of running threads?

    Personally, I think if you have more than 20 or so
    threads in a process, the task swiching time will
    start to exceed the useful work done. Its better to
    use one of the standard patterns for pooling threads.There is no one 'right' or 'maximum' number of threads.
    The number of threads after which things get overly inefficient varies greatly depending on the characteristics of the application. If 20 threads fully consume the CPU, then adding more threads will only make things worse. If 20 threads can only use 10% of the CPU resources because of external delays (network access, database, etc.) then it may be true that using 200 threads is best, assuming of course that the throughput capacity of the network, database or external system can accomidate the increased load.
    What you'd like to avoid is preemption - a runnable thread interrupts a currently running thread that still has need of the CPU - this wastes time. If the running threads tend to block before the end of their time slice, then there really isn't going to be any added cost to context switches, nothing else would be using the CPU anyway.
    If the computer the application is running on has a number of CPU's, then it can probably accomidate more threads than a single CPU system. Of course there are limits to the effectiveness of this and a single process with many threads may not (often does not) run as efectively as several copies of the application with fewer threads each due to various inter thread contention issues.
    Chuck

  • Limiting JMX Monitor Executor Pool size

    Hi all,
    does anybody know how to limit (or in general, set) the size of the Scheduler/Executor Pool in JMX for Monitors?
    By default it seems that 10 threads are created, named [JMX Monitor Executor Pool [Thread-n]]. They get created when I create the first Monitoring MBean, in my case this was a simple GaugeMonitor.
    I don't have a problem with the 10 threads, but its just that our app already has enough threads as it is, plus the granularity period we will use is fairly big (minutes) and we only have a few Monitor beans, so we won't have high load on them.
    Any help appreciated.
    Cheers, Mark

    Mark,
    You can set the system property jmx.x.monitor.maximum.pool.size to control this, either on the command line with e.g. -Djmx.x.monitor.maximum.pool.size=3 or by calling System.setProperty("jmx.x.monitor.maximum.pool.size", "3"). The value of this property is consulted the first time the class javax.management.monitor.Monitor is loaded (typically when you create your first monitor), and not thereafter, so you must be sure to set it beforehand.
    This property is non-standard and will not necessarily work with other implementations of the JMX API, but it does work with the implementation that is in the JDK platform, starting with JDK 6. (Before JDK 6, every monitor had its own thread, so if you are seeing a limit of 10 threads then you are using JDK 6.)
    From my reading of the code, it does look as if more threads will be created than strictly necessary. For example, if you only have one monitor then you don't need more than one thread, but if the monitor's granularity period is less than 60 seconds you will end up with 60/period threads, up to the maximum (default 10). For example 4 threads if the period is 15 seconds. I think we should probably fix that. (The core pool size should probably be 1 rather than the same as the max pool size.)
    Regards,
    �amonn McManus -- JMX Spec Lead -- [http://weblogs.java.net/blog/emcmanus]

  • Has UnixProcess been improved to use ThreadPoolExecutor to reduce threads

    Hi all,
    I am working on an application where hundreds or thousands of Unix process are created from Java application. The Unix process is an application running in the background with a UI interface. It remains running until user exits the application. While the process is running, I notice there is a thread associates to the process in my Java application.
    Thread name: process reaper, id: 265392
    java.lang.UNIXProcess.waitForProcessExit(Native Method)
    java.lang.UNIXProcess.access$900(UNIXProcess.java:20)
    java.lang.UNIXProcess$1$1.run(UNIXProcess.java:132)
    I have found an article where an improvement had been done to OpenJDK where ThreadPoolExecutor is used to reduce total number of threads wit UnixProcess:
    http://answerpot.com/showthread.php?58084-UNIXProcess%20improvements
    How do I find out the if the latest release of 1.6 contains the fix? If not, if there a bug has been filed for such improvement?
    I am using Java 1.6.0_18-b07 on CentOS 5.1.
    Thanks a lot.

    creating hundreds or thousand of processes is a bad idea and very expensive.
    The thread pool is not a process pool. thread != process. However a thread pool could be used to pool the threads you use to read the output of a process, but that will make such a minor difference to the cost of creating a process I wouldn't bother.

  • Need to understand the relation between ManualResetEvent and thread

    please help me to understand the below code
    what is resetEvent.Set() and WaitOne() ? what it does ?
    var resetEvent = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(
    arg =>
    DoWork();
    resetEvent.Set();
    resetEvent.WaitOne();
    again help me to understand the below code
    var events = new List<ManualResetEvent>();
    foreach(var job in jobs)
    var resetEvent = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(
    arg =>
    DoWork(job);
    resetEvent.Set();
    events.Add(resetEvent);
    WaitHandle.WaitAll(events.ToArray());
    why this line WaitHandle.WaitAll(events.ToArray()); is required ?
    why adding ManualResetEvent instance to list ?
    looking for discussion. thanks

    WaitOne() will cause the current (main) thread to wait until the thread pool thread has called the Set() method. If you don't call the WaitOne() method, the code line below ThreadPool.QueueUserWorkItem(...) will get executed before the delegate that you
    pass do the ThreadPool.QueueUserWorkItem method has actually finished its execution because the threads are being executed simultaneously:
    var resetEvent = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(
    arg =>
    //this will be executed simultaneously on thread B
    Thread.Sleep(10000);
    //tell thread A to continue
    resetEvent.Set();
    //thread A waits here until thread B calls the Set() method...
    resetEvent.WaitOne();
    string s = "abc"; //this line won't get executed until thread B has called the Set() method provided that the WaitOne() method is called by thread A above.
    >>why this line WaitHandle.WaitAll(events.ToArray()); is required ?
    It causes the main thread to wait until the Set method of all ManualResetEvent objects in the events list has been called. Othwerwise the execution of the main thread would continue immediately after the foreach loop has been executed. By this time the DoWork
    method of all jobs has not yet been completed because they are being executed on another thread.
    WaitHandle.WaitAll(events.ToArray());
    string s = "abc"; //this line won't get executed until all the Set() method of all ManualResetEvent objects in events has been called
    >>why adding ManualResetEvent instance to list ?
    Because you (appearantly) want to wait for all objects in the list, i.e. you want to wait for the DoWork method to complete for all jobs before you continue the execution of the main thread (and go on to assign the string s to the value "abc"
    in the above example).
    Hope that helps.
    Please remember to close your threads by marking helpful posts as answer then start a new thread if you have a new question. Please don't ask several questions in the same thread.

  • How to add thread in ThreadPoolExecutor to shutdownhook

    I want my application finish task submitted, and try to use Runtime.addShutdownHook(). but how can I add the thread in ThreadPoolExecutor to ShutdownHook?. Is it possible to get the thread in pool? I think the pooled thread will be killed on kill command ( linux)

    Why not just do something like:
              final ThreadPoolExecutor executor = null;
              Runtime.getRuntime().addShutdownHook(new Thread() {
                   @Override
                   public void run() {
                        int fiveSeconds = 5;
                        try {
                             executor.awaitTermination(fiveSeconds, TimeUnit.SECONDS);
                        } catch (InterruptedException e) {
                             // ignore - we're shutting down
              });-Muel

Maybe you are looking for

  • MacBook Pro stopped reading discs, ejects them

    I bought this MacBook Pro in December of '08 (referbished, but from the apple website) and shortly after had a problem with the drive not reading discs and making odd noises. Took it in and they replaced it under the 90 day warranty. I haven't used t

  • Is there an app for BC sage line 50 integration

    Is there an app for BC sage line 50 integration so visitors can draw down invoices and elivery notes onto theire web area

  • Help with second site!!!  Please read

    I have a quick question and "how to". I created a second site for a class (site 2) that I teach. The first site (Site 1) is my personal webpage. I have transfered the whole "domain" to my new work computer and want to only have/publish the class site

  • Updater where are the downloaded files?

    Hi, To avoid re downloading the 300 Megs or more of updates in case of a problem. I would like to know whrere the updater puts thes downloads. I have CS3 and CS4. Thanks.

  • Passing SAP Exceptions to a sync SOAP Call

    Hi, I have a scenario in which I have exposed a RFC as a Web service through XI. My sender is SOAP sender who invokes XI which inturn calls the RFC in SAP. When there is any Error or exception triggered from SAP i.e invalid userid or Insufficient Aut