如何在启动应用程序时启动后台线程

时间:2014-01-14 19:44:18

标签: java factory-pattern scheduledexecutorservice

以下是我的界面 -

public interface IClient {
    public String read(ClientInput input);
}

这是我对界面的实现 -

public class TempClient implements IClient {

    @Override
    public String read(ClientInput input) {

    }
}

以下是我的工厂代码 -

public class TempClientFactory {

    public static IClient getInstance() {
    // new TempScheduler().startScheduler();
    return ClientHolder.INSTANCE;
    }

    private static class ClientHolder {
        private static final TempClient INSTANCE = new TempClient();
    }
}

现在我有一个工厂获得TempClient这样的实例,所以客户将在调用我们的代码时使用我们的工厂。

IClient client = TempClientFactory.getInstance();
client.read(input);

以下是我的后台线程代码 -

public class TempScheduler {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        public void startScheduler() {
            final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(new Runnable() {
                public void run() {
                try {
                    callServers();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                }
            }, 0, 500, TimeUnit.SECONDS);
        }
    }

    //... some code
}

问题陈述: -

  1. 现在我有一个后台线程,它将在场景后面运行,从URL获取数据,解析它并将其存储在变量中。现在我想要的是,一旦我们的客户开始通过使用工厂调用使用我们的代码,我希望后台线程开始。所以我想我可以将后台线程调用放在我的工厂getInstance方法中。这是放在那里的正确位置吗?

1 个答案:

答案 0 :(得分:1)

我想是的,把它放在getInstance()中并且只在第一次调用此方法时调用它。我想这就是你想要的。

OR

如果您正在使用某个框架,并且该框架在应用程序初始化/准备好时向您发送事件,那么您也可以在那里挂钩并在那里执行。但在这种情况下,它甚至可以在客户调用getInstance()之前开始执行。由你来决定是否可以。

后者更好恕我直言。