【发布时间】:2014-01-22 04:46:07
【问题描述】:
下面是我的界面-
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, 10L, TimeUnit.MINUTES);
}
}
//... some code
}
问题陈述:-
- 现在我有一个后台线程,它将在
从 URL 获取数据、解析并存储数据的场景
在一个变量中。现在我想要的是我们的客户一开始
通过使用工厂调用使用我们的代码,我想要
后台线程开始。所以我决定打这个电话
我上面的
TempClientFactory,它工作得很好..
现在这种方法的问题是,客户将继续调用我的 TempClientFactory 所以它会一直启动后台线程。我正在寻找的是,如果后台线程启动一次,那么我不想要从另一个线程再次启动它,但它应该在后台每 10 分钟运行一次,因为它已经第一次启动了。
如果我的理解是正确的,假设如果我调用我的 TempClientFactory 一次,那么它将启动后台线程并且我的后台线程将继续每 10 分钟运行一次。如果我再次调用我的工厂,那么它将再次启动相同的背景,也将每 10 分钟运行一次?或者它只会启动一个每 10 分钟运行一次的后台线程?
【问题讨论】:
-
不给它一个重复周期,直接使用
schedule。如果你再次调用schedule,或者你当前调用它的兄弟,那么它将创建第二个线程。 -
我只需要一个应该每 10 分钟运行一次的后台线程。我不想让客户/客户继续给我们打电话,然后我的后台线程被调用...我这里还有其他方法吗?
标签: java multithreading background-thread scheduledexecutorservice