繁体   English   中英

用Java安全地创建多线程文件

[英]Safe multithreaded file creation in java

我有一个webapp,有时需要从url下载一些字节并将其打包并发送回请求者。 下载的字节会存储一会儿,因此如果需要下载相同的URL,则可以重用它们。 我正在尝试找出最好的方法,以防止在请求同时出现时线程同时下载相同的URL。 我正在考虑创建一个如下所示的类,以防止同时下载相同的URL。 如果无法锁定某个URL,则只要解除锁定后该URL不存在,它就会一直等待直到不再锁定为止。

public class URLDownloader
{
    HashMap<String,String> activeThreads = new HashMap<String,String>();

    public synchronized void lockURL(String url, String threadID) throws UnableToLockURLException
    {
        if(!activeThreads.containsKey(url))
            activeThreads.put(url, threadID)
        else
            throw UnableToLockURLException()
    }

    public synchonized void unlockURL(String url, String threadID)
    {
        //need to check to make sure its locked and by the passed in thread
        returns activeThreads.remove(url); 
    }

    public synchonized void isURLStillLocked(String url)
    {
        returns activeThreads.contains(url); 
    }

}

有谁对此有更好的解决方案? 我的解决方案似乎有效吗? 有没有可以很好利用的开源组件呢?

谢谢

我建议保持ConcurrentHashSet<String>来跟踪对所有线程可见的唯一URL。 此构造可能不直接存在于Java库中,但可以通过ConcurrentHashMap轻松构造,如下所示: Collections.newSetFromMap(new ConcurrentHashMap<String,Boolean>())

听起来好像不需要锁,因为如果有多个请求下载同一URL,那么关键是只下载一次。

另外,我认为在封装方面将检查存储的URL /例程以将新的URL存储在URLDownloader类中而不是在调用类中URLDownloader 您的线程可以简单地调用例如fetchURL() ,并让URLDownloader处理细节。

因此,您可以通过两种方式实现此目的。 如果没有恒定的下载请求流, URLDownloader简单的方法是只运行一个URLDownloader线程,并使它的fetchURL方法synchronized ,以便一次只能下载一个URL。 否则,将待处理的下载请求保留在中央LinkedHashSet<String> ,该中心可保留顺序并忽略重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM