Синглтон класса, унаследованного от родительского класса, чтобы пользоваться функциональностью


У меня есть синглтон-класс, который простирается от абстрактного класса java. Два одноэлементных классов простираются от ItemImageThreadManager, причина этого заключается в использовании общей функции планирования. Поток создается и передается в runThread метод ItemImageThreadManager.

Это хороший дизайн?

Абстрактный Родительский Класс

public abstract class ItemImageThreadManager {

    private Timer timer = new Timer();

    public void runThread(final Thread runThread){

        try { 
            scheduleTimer(runThread);
        }
        catch(IllegalStateException ise){
            /**
             * When the timer is cancelled (when screen closed) and the images are 
             * removed from memory(in-app resync) and this screen is opened again, 
             * an IllegalStateException will be thrown since the images will need 
             * to be re-downloaded
             * 
             * Solution - create a new timer.
             */
            timer = new Timer();
            scheduleTimer(runThread);
        }
    }

    /**
     * Starts a new thread. This thread is run in the order is has been added.
     * Since timer runs in it's own thread, this gaurantees that just one thread 
     * will be started at one time....
     * @param thread
     */
    private void scheduleTimer(final Thread thread){

        timer.schedule(new TimerTask() {

            public void run() {
                thread.start();
                try { 
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, 0);
    }


    public void cancelTimer(){
        timer.cancel();
    }

}

Первый расширенного класса

public class ContestantImageThreadManager extends ItemImageThreadManager{

    private static ContestantImageThreadManager ref;

    private ContestantImageThreadManager(){
        super();
    }

    public static ContestantImageThreadManager getSingletonObject()
    {
      if (ref == null){
          ref = new ContestantImageThreadManager();
      }
      return ref;
    }

}

Второй расширенного класса

public class JudgeItemImageThreadManager extends ItemImageThreadManager{

    private static JudgeItemImageThreadManager ref;

    private JudgeItemImageThreadManager(){

    }
    public static JudgeItemImageThreadManager getSingletonObject()
    {
      if (ref == null){
          ref = new JudgeItemImageThreadManager();
      }
      return ref;
    }

}


Комментарии
1 ответ

Как другие упомянули getSingletonObject должны быть синхронизированы. Есть глава, в эффективная Java, второе издание о синглтонов (пункт 3: обеспечить синглтон собственность с собственной конструктор или перечислимый тип). Стоит прочитать. В любом случае, старайтесь избегать их, они делает тестирование очень трудно.

Можно использовать таймер как однопоточный исполнитель. В этом случае рекомендуется использовать исполнителей.newSingleThreadExecutor. Кроме того, вы уверены, что вам нужно пройти - нить вообще? Не выполнимое хватит? Исполнительможет выполнить выполнимоебез каких-либо фантик класса и резьбы.присоединиться к вызову.

Вместо того, чтобы ловить IllegalStateException в runThread способ следует проверить наличие таймера отменяется. Вы можете хранить его в логический флаг. Не забудьте синхронизировать доступ к переменной. (См. эффективная Java, пункту 57: используйте исключения только для исключительных условиях)

ExecutorService.подать возвращает будущее , которое есть отмена способ. Может быть, это лучше для вас требования (вместо таймера.отменить()).

Если вы не знакомы с параллельного кода проверки на Java параллелизм на практике.

2
ответ дан 2 декабря 2011 в 09:12 Источник Поделиться