次のコードに関していくつかの懸念があります。
public class Task implements Runnable {
String filePath = "C:\\Backup\\test.xml";
@Override
public void run() {
File file = new File(filePath);
try {
System.out.println(Thread.currentThread() + " Renaming " + FileUtil.changeFileExtention(file));
Thread.sleep(20000);
System.out.println(Thread.currentThread() + " Renaming Back " + FileUtil.changeFileExtention(file));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ここで、`FileUtil' はクラスです。
public class FileUtil {
public static File changeFileExtention(File file) throws Exception {
File newFile = null;
int extIndex = file.getName().lastIndexOf(".");
String ext = getExtentionFromFile(file);
System.out.println("File Extention is [" + ext + "] for file [" + file.getName() + "].");
if (ext.equalsIgnoreCase(".xml")) {
newFile = buildChangedFile(file, extIndex, ".txt");
} else if (ext.equalsIgnoreCase(".proc")) {
newFile = buildChangedFile(file, extIndex, ".xml");
}
file.renameTo(newFile);
return newFile;
}
public static String getExtentionFromFile(File file) throws Exception {
String fileName = file.getName();
int extIndex = fileName.lastIndexOf(".");
if (extIndex != -1) {
return fileName.substring(extIndex);
} else {
String msg = "File extention not found for file [" + fileName + "]";
System.out.println(msg);
throw new Exception(msg);
}
}
private static File buildChangedFile(File file, int extIndex, String targetExtention) throws Exception {
String fileName = file.getName();
File renamedFile = null;
if (file.exists()) {
String newFileName = fileName.substring(0, extIndex) + targetExtention;
System.out.println("New File name -" + newFileName);
String fullPathWithName = file.getParent() + "/" + newFileName;
renamedFile = new File(fullPathWithName);
} else {
String msg = "File not exisit in location [" + file.getAbsolutePath() + "]";
System.out.println(msg);
throw new Exception(msg);
}
return renamedFile;
}
}
ここに私のテストクラスがあります -
public class Test {
public static void main(String[] args) {
Thread thread1 = new Thread(new Task());
Thread thread2 = new Thread(new Task());
Thread thread3 = new Thread(new Task());
thread1.start();
thread2.start();
thread3.start();
}
}
私が必要とするのは、あるスレッドがファイルを取得した場合、他のスレッドがそのファイルを無視する必要があることです。ここでのスレッドプロセスについてはあまり明確ではなく、混乱しています。
synchronize
名前の変更プロセスをブロックで行う必要がありますか?- 私の
FileUtil
メソッドはスレッドセーフですか? - クラスはスレッドごとに新しいインスタンスを作成するため
Task
、スレッドごとに独自のfile
オブジェクトが必要です。この場合、オブジェクトはヒープに作成されるため、共有されますか? それとも、1 つのスレッドがヒープ内に独自のオブジェクト スタックを持つのでしょうか? - 2 つのスレッドが同時にファイルの名前を変更しようとするとどうなりますか? (util メソッドを作成する必要があります
synchronize
か?)
私の混乱を解消するためにあなたの助けに非常に感謝します. よろしくお願いします。