典型的なプログラムでは、メインスレッドは1つだけで、トップダウン順に実行されます。
しかし、マルチスレッドプログラムでは、複数のスレッドが同時に実行されるため、プログラマは設計時に個々のスレッドの実行終了時刻を予測することができません。
次のスレッドクラスを見て、ファイルサイズを読み取り、その結果をスレッドのローカル変数に入れます。
/*** ファイル・サイズを読み込む*/public class ReadFileRunnable implements Runnable { /** * ファイル名 */ private String fileName; public ReadFileRunnable(String fileName) { this.fileName = fileName; } /** * ファイル・サイズ、デフォルトは-2 */ private long length = -2; public long getLength() { return length; } @Override public void run() { File f = new File(fileName); if (f.exists() && f.isFile()) { this.length = f.length(); } else { this.length = -1;// ファイルが存在しない } }}
一般的な考え方に従えば、スレッドを立ててファイルサイズを取得し、そのファイルサイズを出力します。
public static void main(String[] args) { // スレッドを開始する ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt"); Thread thread = new Thread(writeFileRunnable); thread.start(); // 出力結果システム.out.println("length:" + writeFileRunnable.getLength());// 出力-2 }
数回実行すると、出力が-2、これはスレッドの開始がまだ実行を完了していないため、次の出力文が実行されています。これは、開始スレッドがファイルを読み取る必要があるため、IO操作であり、速度は確実に遅くなります。
これを解決する最も簡単な方法は、ポーリングを使ってスレッドの実行結果をチェックし続けることです。
public static void main(String[] args) { // スレッドを開始する ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt"); Thread thread = new Thread(writeFileRunnable); thread.start(); // 待機中 { if (writeFileRunnable.getLength() == -2) {// 結果が続かない; } else { System.out.println("length:" + writeFileRunnable.getLength());// 出力-2 ブレーク;// 結果の最後まで、ファイル・サイズを出力することができる。 } } }
ポーリングを使えば問題が解決するように見えるかもしれませんが、実際には非常に無駄なパフォーマンスです。テストしてみましょう:
public static void main(String[] args) { // スレッドを開始する ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt"); Thread thread = new Thread(writeFileRunnable); thread.start(); // 常に待つ int i = 0; while (true) { i++; if (writeFileRunnable.getLength() == -2) {// 結果が続かない; } else { System.out.println("ループ実行時間:" + i);// ループ実行時間:14365 System.out.println("length:" + writeFileRunnable.getLength());// 出力-2 ブレーク;// 結果が終わるまで } } }
つまり、1万回以上チェックしても、有効なのは1回だけというのは、非常にもったいないと言わざるを得ません。
マルチスレッド化されたプログラムでは、スレッドから返されたデータを取得するためにポーリングを使用することができますが、これはパフォーマンスの大きな無駄であり、一般的には推奨されません。





