blog

Java ポーリングを使ってスレッド・データを取得する

1.マルチスレッド機能 一般に、メインスレッドは1つだけで、上から下へ順次実行されます。 しかし、マルチスレッド・アプリケーションでは、複数のスレッドの実行が並行して行われ、プログラマは設計時に各スレ...

Oct 11, 2020 · 3 min. read
シェア

典型的なプログラムでは、メインスレッドは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回だけというのは、非常にもったいないと言わざるを得ません。

マルチスレッド化されたプログラムでは、スレッドから返されたデータを取得するためにポーリングを使用することができますが、これはパフォーマンスの大きな無駄であり、一般的には推奨されません。



Read next

HTMLキー・タグ

iframeを使用した最高レベルのドキュメント読み込みウィンドウは、iframeでこれを設定すると、現在のページに影響します。 デフォルト値は、このページで開きます。 target:プログラマ独自の値xxxは、新しいプログラマ独自のページを作成することができます、ページ名はxxxです。

Oct 11, 2020 · 4 min read