user4341206
user4341206

Reputation: 647

Difference between newScheduledThreadPool(1) and newSingleThreadScheduledExecutor()

I am wondering what is the difference between these two methods of Executors class? I have a web application where I'm checking some data every 100 ms so that's why I'm using this scheduler with scheduleWithFixedDelay method. I want to know which method should I use in this case (newScheduledThreadPool or newSingleThreadScheduledExecutor)? I also have one more question - in VisualVM where I monitor my Glassfish server I noticed that I have some threads in PARK state - for example:

java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <3cb9965d> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Is it possible that these threads are connected with scheduler because I don't have any idea what else would create them? These threads are never destroyed, so I am afraid that this could cause some troubles. Here is a screenshot (new Thread-35 will be created in 15minutes and so on...):

enter image description here

Upvotes: 11

Views: 22018

Answers (3)

venergiac
venergiac

Reputation: 7717

As pointed out by wings and tagir the differences is in "how to manage failure".

About Thread your thread is in Wait status; park is not a status but is a method to put the Thread in wait status; see also

How to detect thread being blocked by IO?

However, let me suggest a different way to implement a scheduled thread on Java EE; you should take a look at EJB's TimerService

@Singleton
public class TimerSessionBean {
    @Resource
    TimerService timerService;   

    public void setTimer(long intervalDuration) {
        Timer timer = timerService.createTimer(intervalDuration, 
                "Created new programmatic timer");
    }

    @Timeout
    public void lookForData(Timer timer) {
        //this.setLastProgrammaticTimeout(new Date());
        ....
    }

    //OR
    @Schedule(minute = "*/1", hour = "*")
    public void runEveryMinute() {
      ...
    }

   }

Upvotes: 1

wings
wings

Reputation: 801

newSingleThreadScheduledExecuto() is wrapped by a delegate, as you can see in Executors.java:

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}

Differences (from javadoc):

if this single thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks.

Unlike the otherwise equivalent {@code newScheduledThreadPool(1)} the returned executor is guaranteed not to be reconfigurable to use additional threads.

reply to your comment:

do this also apply for newScheduledThreadPool(1) or not?

no, you need to take care of thread failure yourself.

As for Unsafe.park(), see this.

Upvotes: 6

Tagir Valeev
Tagir Valeev

Reputation: 100239

As documentation states:

Unlike the otherwise equivalent newScheduledThreadPool(1) the returned executor is guaranteed not to be reconfigurable to use additional threads.

So when using newScheduledThreadPool(1)you will be able to add more threads later.

Upvotes: 9

Related Questions