Java 使用进程ID和线程ID命名目录

Java 使用进程ID和线程ID命名目录,java,multithreading,pid,Java,Multithreading,Pid,我有一个应用程序,它有几个线程,可以在Linux或Windows机器上操作数据并将输出保存在特定目录下的不同临时文件中。这些文件最终需要删除 我想做的是能够更好地分离文件,因此我考虑通过进程ID和线程ID来实现这一点。这将帮助应用程序节省磁盘空间,因为在线程终止时,可以擦除包含该线程文件的整个目录,并让应用程序的其余部分重新使用相应的磁盘空间 由于应用程序在JVM的单个实例上运行,我假设它将有一个进程ID,这将是JVM的进程ID,对吗 在这种情况下,区分这些文件的唯一方法是将它们保存在一个文件夹

我有一个应用程序,它有几个线程,可以在Linux或Windows机器上操作数据并将输出保存在特定目录下的不同临时文件中。这些文件最终需要删除

我想做的是能够更好地分离文件,因此我考虑通过进程ID和线程ID来实现这一点。这将帮助应用程序节省磁盘空间,因为在线程终止时,可以擦除包含该线程文件的整个目录,并让应用程序的其余部分重新使用相应的磁盘空间

由于应用程序在JVM的单个实例上运行,我假设它将有一个进程ID,这将是JVM的进程ID,对吗

在这种情况下,区分这些文件的唯一方法是将它们保存在一个文件夹中,该文件夹的名称将与线程ID相关


这种方法合理吗?或者我应该做些别的事情吗?

java.io.File可以为您创建临时文件。只要保留与每个线程关联的那些文件的列表,就可以在线程退出时删除它们。您还可以将文件标记为,以防线程未完成。

您是正确的,JVM有一个进程ID,该JVM中的所有线程都将共享该进程ID。(JVM可以使用多个进程,但好吧,没有JVM会这样做。)

JVM可以很好地为多个Java线程重用底层OS线程,因此在Java中存在的线程与OS级别发生的任何类似事件之间没有保证的相关性

如果您只需要清理过时的文件,那么按照文件的创建时间戳对文件进行排序就足够了吗?不需要在临时文件名中编码任何特殊内容


请注意,PID和TID既不能保证增加,也不能保证在出口之间是唯一的。操作系统可以自由回收ID。(实际上,ID必须在重新使用之前进行包装,但在某些机器上,可能只创建了32k或64k个进程。

这种方法的最简单解决方案似乎是真正扩展线程-我从未想过会有这样的一天

正如p.T.已经说过的,线程ID只有在线程处于活动状态时才是唯一的,它们可以而且肯定会被操作系统重用

因此,不要这样做,而是使用可以在构造时指定的线程名称,为了使其简单,只需编写一个小类:

public class MyThread extends Thread {
    private static long ID = 0;

    public MyThread(Runnable r) {
        super(r, getNextName());
    }

    private static synchronized String getNextName() {
         // We can get rid of synchronized with some AtomicLong and so on, 
         // doubt that's necessary though
        return "MyThread " + ID++;
    }

}
然后你可以这样做:

public static void main(String[] args) throws InterruptedException {
    Thread t = new MyThread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Name: " + Thread.currentThread().getName());
        }
    });
    t.start();
}
您必须覆盖所有要使用的构造函数,并且始终使用
MyThread
类,但这样您可以保证一个唯一的映射-至少2^64-1(负值也可以),这应该足够了


虽然我仍然不认为这是最好的方法,可能更好地创造一些“工作”类,该类包含所有必需的信息,并可以在不再需要时尽快清理其文件。这样,您还可以轻松使用线程池和co,其中一个线程将执行多个任务。目前,线程中有业务逻辑,这对我来说不是特别好的设计。

我知道这些可能性,但应用程序处理大量数据,因此它可能在线程退出之前就耗尽了磁盘空间。您的程序如何知道何时不再需要每个临时文件?如果存储似乎是个问题,您为什么要关心如何组织它们?它会对文件进行一些处理,然后再处理它。我只需要在directorie中组织它们正如我所描述的,处理它们,然后删除整个目录。我仍然不明白为什么要按进程和线程id组织临时文件。只要在程序中有对它们的引用(理想情况下是
java.io.File
实例),您可以非常轻松地删除它们,无论它们是如何组织的。原因有很多,包括任何应用程序(或服务器)崩溃并将数据留在磁盘上的可能性。这些需要稍后清理。无法基于时间或任何其他“文件系统”进行清理属性,因为文件是线程特定的。