Именование каталогов с использованием идентификатора процесса и идентификатора потока - PullRequest
2 голосов
/ 24 сентября 2011

У меня есть приложение с несколькими потоками, которые манипулируют данными и сохраняют вывод в разных временных файлах в определенном каталоге, на компьютере Linux или Windows.Эти файлы в конечном итоге должны быть стерты.

Что я хочу сделать, чтобы иметь возможность лучше разделять файлы, так что я думаю сделать это по идентификатору процесса и идентификатору потока.Это поможет приложению сэкономить дисковое пространство, потому что после завершения потока весь каталог с файлами этого потока может быть удален, а оставшаяся часть приложения может повторно использовать соответствующее дисковое пространство.

Поскольку приложение работает наодин экземпляр JVM, я предполагаю, что он будет иметь один идентификатор процесса, который будет идентичным JVM, верно?

В таком случае единственный способ различить эти файлы - сохранить ихв папке, имя которой будет связано с идентификатором потока.

Является ли этот подход разумным или мне следует заняться чем-то другим?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2011

java.io.File может создать временных файлов для вас.Пока вы храните список файлов, связанных с каждым потоком, вы можете удалять их при выходе из потока.Вы также можете пометить файлы как удалить при выходе , если поток не завершен.

1 голос
/ 24 сентября 2011

Кажется, самое простое решение для этого подхода - действительно расширить поток - никогда не думал, что увижу этот день.

Поскольку PT уже сказал, что идентификаторы потоков уникальны, пока поток жив, ониможет и, безусловно, будет повторно использоваться ОС.

Поэтому вместо того, чтобы делать это таким образом, вы используете имя потока, которое можно указать при построении, и, чтобы упростить его, просто напишите небольшой класс:

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 (отрицательные значения тоже хороши), которого должно быть более чем достаточно.

Хотя Я все еще не думаю, что это лучший подходВозможно, лучше создать некоторый класс "job", который содержит всю необходимую информацию и может очистить его файлы, как только он больше не нужен - таким образом, вы также можете легко использовать ThreadPools и coздесь один поток сделает больше, чем одну работу.На данный момент у вас есть бизнес-логика в потоке - это не особенно поразительно для меня.

1 голос
/ 24 сентября 2011

Вы правы, у JVM есть один идентификатор процесса, и все потоки в этой JVM будут совместно использовать идентификатор процесса. (JVM может использовать несколько процессов, но AFAIK, ни одна JVM не делает этого.)

JVM вполне может повторно использовать базовые потоки ОС для нескольких потоков Java, поэтому нет гарантированной корреляции между потоком, выходящим из Java, и чем-то похожим, происходящим на уровне ОС.

Если вам просто нужно очистить устаревшие файлы, сортировка файлов по времени их создания должна сделать работу достаточно? Во временных именах файлов вообще не нужно ничего кодировать.

Обратите внимание, что идентификаторы PID и TID не будут гарантированно увеличиваться, и гарантированно не будут уникальными на всех выходах . ОС может свободно перерабатывать ID. (На практике идентификаторы необходимо оборачивать перед повторным использованием, но на некоторых машинах это может произойти после того, как были созданы только процессы 32 или 64 КБ.

...