Реализация потока монитора в Java - PullRequest
2 голосов
/ 20 января 2012

Ну, я не знаком с потоками в Java, поэтому я имею дело с этой проблемой: у меня есть одноэлементный объект, который содержит некоторые объекты (скажем, сеансы), и каждый объект имеет продолжительность времени, так что это означает, что после некотороговремя, когда один объект считается истекшим, поэтому его необходимо удалить из (пул - список в синглтоне) синглтона.Для этого я решил создать поток, который проверяет каждые 5 минут (или 10 минут или что-то еще) и очищает весь сеанс в классе синглтона.Как я могу реализовать такую ​​функциональность, избегая любых возможных тупиковых и / или занимающих много времени блоков.Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 20 января 2012

Я бы так не реализовал. Вместо этого, я бы удалил тайм-аут сеансов, когда сеанс запрашивается в пуле (хотя не обязательно при каждом получении). Это, кстати, то, что делает CacheBuilder Guava, который вы можете использовать, поскольку он прост, протестирован и предоставляет полезные функции.

Если вы действительно хотите пойти по этому пути, то вам, вероятно, следует использовать ConcurrentMap или ConcurrentList и использовать однопоточную ScheduledExecutorService , которая будет пробуждать итерацию по списку и удалять старые сеансы каждые X минут .

2 голосов
/ 20 января 2012

Я согласен с @quaylar (+1), используйте существующую технологию кэширования, если можете.

Однако, если вы не можете, одним из решений является использование java.util.Timer. Инициализируйте его временем до истечения срока действия первого объекта сеанса и переведите его в спящий режим. Затем, при пробуждении, попросите удалить объект сеанса и сбросить его со временем до следующего срока действия. Позвольте Java обрабатывать аспекты синхронизации.

2 голосов
/ 20 января 2012
Runnable cleaner = new Runnable() {
public void run() { /* remove expired objects here */ 
     //Using get method check whether object is expired 
   }
};
Executors.newScheduledThreadPool(1)
       .scheduleWithFixedDelay(cleaner, 0, 30, TimeUnit.SECONDS);
2 голосов
/ 20 января 2012

Можно ли использовать ранее существующее решение для кэширования в памяти вместо того, чтобы писать свое собственное? Если да, вы можете проверить Google Guava, который предлагает Caching-решение среди многих других вещей.

  1. См .: Кэширование с гуавой
  2. См .: http://guava -libraries.googlecode.com / svn / trunk / javadoc / com / google / common / cache / CacheBuilder.html
1 голос
/ 20 января 2012

Ну, вы можете сделать что-то вроде этого: я предполагаю, что класс для вашего одноэлементного объекта называется singleton, поэтому у вас есть что-то вроде этого (это не идеальный код)

public class Singleton {
   List<Objects> singletonList = Collections.synchronizedList(new ArrayList<Objects>);



}

public class RemoveExpiredItemsThread implements Runnable {

    private Singleton singletonReference;
    private int sleepTime = 5*60*1000;
    // the constructor

    // then the run method which is something like this

    public void run() {
       while(done == false) {
         Thread.sleep(sleepTime);
         singletonReference.removeItem();
       }  
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...