我的情况是我有大量需要进行文件(只读)访问的类。这是在OSGI上运行的Web应用程序的一部分,因此将有很多并发需要访问。
所以我正在构建一个OSGI服务来访问文件系统以获取所有其他需要它的部分并提供集中访问,因为这也简化了文件位置的配置等。
在我看来,多线程方法与线程池一起最有意义。
所以问题是:
如果我这样做,我的服务有如下界面: FileService.getFileAsClass(类);
和方法getFileAsClass(类)看起来有点像这样:(这是一个草图,它可能不是完美的java代码)
public < T> T getFileAsClass(Class< T> clazz) {
Future<InputStream> classFuture = threadpool.submit(new Callable< InputStream>() {
/* initialization block */
{
//any setup from configs.
}
/* implement Callable */
public InputStream call() {
InputStream stream = //new inputstream from file location;
boolean giveUp = false;
while(null == stream && !giveUp) {
//Code that tries to read in the file 4
// times with a Thread.sleep() then gives up
// this is here t make sure we aren't busy updating file.
}
return stream;
}
});
//once we have the file, convert it and return it.
return InputStreamToClassConverter< T>.convert(classFuture.get());
}
这是否会正确等待相关操作才能调用InputStreamtoClassConverter.convert?
这是我第一次编写多线程java代码,所以我不确定我对某些行为的期望是什么。我不关心哪些线程完成的顺序,只关心文件处理是异步处理的,一旦完成文件拉取,然后才使用转换器。