Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何存储处理不同文件的多个线程_Java_Multithreading_Concurrency - Fatal编程技术网

Java:如何存储处理不同文件的多个线程

Java:如何存储处理不同文件的多个线程,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个服务器,根据请求发送不同的文件(每个文件打开一个线程)。 每个线程都不知道创建时处理的是哪个文件,但只在收到一条带有其名称的消息后才知道,所以当时我需要以某种方式将其与文件关联起来 我需要选择等待某个文件的所有线程结束,当然还有 服务器中的所有线程 整个线程是通过一个线程组完成的, 至于文件,我想给每个文件添加一个线程列表(我已经为它添加了一个包装器类),并添加等待某个文件的选项。 但我不认为这是一个好的解决方案,加上我需要使用一些并发集合,我找不到任何只是一个并发链表的东西 有没有关于

我有一个服务器,根据请求发送不同的文件(每个文件打开一个线程)。 每个线程都不知道创建时处理的是哪个文件,但只在收到一条带有其名称的消息后才知道,所以当时我需要以某种方式将其与文件关联起来

我需要选择等待某个文件的所有线程结束,当然还有 服务器中的所有线程

整个线程是通过一个线程组完成的, 至于文件,我想给每个文件添加一个线程列表(我已经为它添加了一个包装器类),并添加等待某个文件的选项。 但我不认为这是一个好的解决方案,加上我需要使用一些并发集合,我找不到任何只是一个并发链表的东西

有没有关于如何实施的建议

我需要选择等待所有的时间 要结束的特定文件的线程

我不太清楚您的要求,但我认为这样的方式适合您:

// FileSender is the wrapper class you mentioned - where you keep track
// of file->threads association
public class FileSender {
    private final File file;

    private List<Thread> threads = new ArrayList<Thread>();

    public FileSender(File file) {
        this.file = file;
    }

    public void addThread(Thread thread) {
        if (thread != null) {
            this.threads.add(thread);
        }
        for (Iterator<Thread> itr = threads.listIterator(); itr.hasNext();) {
            Thread t = itr.next();
            if (! t.isAlive()) {
                itr.remove();
            }
        }
    }

    // this method blocks until all threads associated with
    // this file has completed execution
    public void waitForCompletion() throws InterruptedException {

        for (Iterator<Thread> itr = threads.listIterator(); itr.hasNext();) {
            Thread thread = itr.next();
            thread.join();
            itr.remove();
        }
    }
}
//FileSender是您提到的包装器类,您可以跟踪它
//创建文件->线程关联
公共类文件发送程序{
私人最终文件;
private List threads=new ArrayList();
公共FileSender(文件){
this.file=文件;
}
公共void addThread(线程线程){
if(线程!=null){
this.threads.add(thread);
}
for(迭代器itr=threads.listIterator();itr.hasNext();){
线程t=itr.next();
如果(!t.isAlive()){
itr.remove();
}
}
}
//此方法将阻塞,直到与
//此文件已完成执行
public void waitForCompletion()引发InterruptedException{
for(迭代器itr=threads.listIterator();itr.hasNext();){
Thread Thread=itr.next();
thread.join();
itr.remove();
}
}
}

我不明白你的问题。你想做什么?为什么多个线程在同一个文件上工作?您正在使用SSD磁盘吗?解释什么是真正的问题,而不是你如何解决它。你在寻找线程。(?)?考虑使用JavaUTI.ConcConnect。CurtDutLtChanCin短的服务器,人们从它下载文件,客户端连接和下载文件(可能是同一个文件,可能不同)。每个请求都会打开一个线程(这样就不会锁定其他请求)。然后,线程接收一个文件名请求并发送它,同时,我可以使用一个服务器控制台(重命名/删除)修改文件。因此,如果我更改文件a.txt,有3个人正在下载,我需要命令等待,然后才更改其名称。因此,当这3个人下载时,您停止提供该文件,直到最后一个文件完成?如果最后一个人速度很慢,需要几天才能完成,该怎么办。在此期间,该文件是否仅对已下载的用户可用?您可能会看到一个场景,其中文件系统和应用程序之间的抽象层是有意义的。将您与文件系统锁分离可能是必要的。