0

A project requires the following scenario to happen:

class A has some objects(dynamically created) which it generates along with a time interval associated with each object. This class needs the generated object after this time interval only. I need to implement a mechanism which provides the class with the objects after it's associated time interval. It may also, sometime, need a particular object before the time interval expires.

Here's what I did:

  • Looked upon ConcurrentTaskExecutor and org.springframework.scheduling.concurrent but didn't find it useful because I don't want thousands of thread running each for an object. Also, I don't want to repeat a particular job after a time interval.

  • I created a Thread B which takes all the object in a queue, has an infinite loop which constantly checks all the object's time interval with the current time, and puts back if it's time interval has not expired.

    while (true) {
        timerObject = queue.take();
        if (timerObject.getEndTime() < System.currentTimeMillis()) {
           //Do something
            } else {
           queue.put(timerObject);
            }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

This is not a very efficient implementation itself. It has a logical error associated with it. When the objects are very low in number(like 1 or 2), the objects are not in the queue and whenever I try to remove the object from the queue, it shows unsuccessful, because the while loop is having the object all the time. And hence I had to put a sleep to avoid that. I don't want to check each and every time interval when the queue size grows up to 10K or so.

Is there any simple and efficient way to achieve the solution. Any help appreciated.

4

1 回答 1

1

您可以使用ConcurrentTaskScheduler,或使用DelayQueue实现类似的东西。您可以将它与 spring 的 Concurrent 框架(例如子类化 ThreadPoolExecutorFactoryBean)或核心 java Executors 一起使用。

于 2013-09-05T08:12:03.420 回答