用Java封装多线程操作

用Java封装多线程操作,java,multithreading,osgi,threadpool,Java,Multithreading,Osgi,Threadpool,我的情况是,我有大量的类需要进行文件(只读)访问。这是运行在OSGI之上的web应用程序的一部分,因此将有大量并发访问需求 因此,我正在构建一个OSGI服务来访问所有其他需要它的部分的文件系统,并提供集中访问,因为这也简化了文件位置的配置,等等 在我看来,多线程方法与线程池一起使用最有意义 所以问题是: 如果我这样做,并且我有一个具有如下接口的服务: getFileAsClass(类) 方法getFileAsClass(class)看起来有点像:(这是一个草图,可能不是完美的java代码) pu

我的情况是,我有大量的类需要进行文件(只读)访问。这是运行在OSGI之上的web应用程序的一部分,因此将有大量并发访问需求

因此,我正在构建一个OSGI服务来访问所有其他需要它的部分的文件系统,并提供集中访问,因为这也简化了文件位置的配置,等等

在我看来,多线程方法与线程池一起使用最有意义

所以问题是:

如果我这样做,并且我有一个具有如下接口的服务: getFileAsClass(类)

方法getFileAsClass(class)看起来有点像:(这是一个草图,可能不是完美的java代码)

publicT getFileAsClass(Classclazz){
Future classFuture=threadpool.submit(新的可调用(){
/*初始化块*/
{
//配置中的任何设置。
}
/*实现可调用*/
公共InputStream调用(){
InputStream=//来自文件位置的新InputStream;
布尔放弃=假;
while(null==流&&!放弃){
//试图在文件4中读取的代码
//使用线程执行次。sleep()然后放弃
//这是这里,我不确定我们没有忙着更新文件。
}
回流;
}
});
//一旦我们有了文件,转换它并返回它。
返回InputStreamToClassConverter.convert(classFuture.get());
}
在调用InputStreamtoClassConverter.convert的相关操作完成之前,这是否正确


这是我第一次编写多线程java代码,所以我不确定某些行为会发生什么。我不关心线程完成的顺序,只关心文件处理是异步处理的,一旦文件拉取完成,那么转换器就会被使用。

到底“null==InputStream”应该是什么?为什么要尝试4次更新文件?通常,当它失败时,当你再试一次时,它也会失败。@isnot2bad抱歉,就像我说的不是“真正的”java代码,只是勾勒出它的意思。我更新了代码以反映我的意思。至于更新文件,这将是一个服务器上的新文件得到推送和定期更新。因此,文件读取可能会失败,但一秒钟后就会成功。调用线程在
threadpool.submit
classFuture.get()之间不执行任何操作。因此,您的程序不是真正的多线程程序。如果
getFileAsClass
完全按照
call
所做的去做,它的效果会更好。创建未来,然后立即调用该未来的get()是没有意义的。这会导致调用线程阻塞,直到将来的结果可用为止。换句话说,这与您直接在调用线程中执行所有IO完全相同!
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());
}