首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java线程从静态内部类访问外部类

java线程从静态内部类访问外部类
EN

Stack Overflow用户
提问于 2011-09-22 02:10:43
回答 2查看 513关注 0票数 2

这是建立在我的previous question上的。

我的ftp服务器有10个文件,比如test1.txt、test2.txt等等。我希望能够同时下载多个文件(最多3个)。我正在调用downloadFilesByPattern(....),如果我不在downloadFile()上使用synchronized,那么只会下载部分文件,而不是全部。如果我使用同步,那么所有的文件都会被下载,但我不认为它们是并行发生的。这是一个问题,因为实例varible被传递给所有线程,而该实例上的方法被所有线程调用。

代码语言:javascript
复制
public class FTPClientService implements IClient {

private String username;
private String password;
private String port;
private String host;
private String path;
FTPClient client = new FTPClient();

private static class DownloadTask implements Runnable {

    private String name;
    private String toPath;
    private IClient client;

    public DownloadTask(String name, String toPath, IClient client) {
        this.name = name;
        this.toPath = toPath;
        this.client = client;
    }

    @Override
    public void run() {
        System.out.println("download = " + name);
        client.downloadFile(name, toPath);
    }
}

public void downloadFilesByPattern(String fileNamePattern, final String outputFilePath) {

    if(!changeDirectory()){
        return;
    }

    try {
        //get a list of file names that match the pattern
        String[] names = client.listNames();

        ExecutorService pool = Executors.newFixedThreadPool(3);
        for (String name : names) {
            //check if the filename matches the pattern
            Pattern pattern =  Pattern.compile(fileNamePattern);
            Matcher matcher = pattern.matcher(name);
            if(matcher.find()){
                System.out.println("Match found = " + name);
                pool.submit(new DownloadTask(name, outputFilePath, this));
            }else{
                System.out.println("No match = " + name);
            }
        }
        pool.shutdown();
        try {
            pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
        } catch (InterruptedException ex) {
        }

    } catch (IOException ex) {
    }
}

public synchronized void downloadFile(String fileName, String outputFilePath) {

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(outputFilePath+"/"+fileName);
        if(this.isFilePresent(fileName)){
            //look for fileName in the path and write it to 
            client.retrieveFile(fileName, fos);
            System.out.println("Downloading file " + fileName + " ...");
        }else{
            System.out.println("Could not find file " + fileName);
        }
    } catch (IOException ex) {
    } finally {
        try {
            fos.close();
        } catch (IOException ex) {
        }
    }
}
}
EN

Stack Overflow用户

回答已采纳

发布于 2011-09-22 02:15:34

这是因为它们都使用相同的

代码语言:javascript
复制
FTPClient client

您需要为每个下载/线程创建新的FTPClientService实例,或者为每个线程创建一个FTPClient实例。我个人更喜欢第二个变体,它可以很容易地使用ThreadLocal实现。

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7504557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档