Кажется, самое простое решение для этого подхода - действительно расширить поток - никогда не думал, что увижу этот день.
Поскольку 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здесь один поток сделает больше, чем одну работу.На данный момент у вас есть бизнес-логика в потоке - это не особенно поразительно для меня.