1.マルチスレッドの特徴
一般的なプログラムでは、メインスレッドは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();
// 输出结果
System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
}
何度も実行すると、出力は-2になります。これは、開始したスレッドがまだ実行されておらず、以下の結果を出力するステートメントが実行されているためです。これは、開始したスレッドがIO操作であるファイルを読み取る必要があり、速度が比較的遅いためです。
2.ポーリングを使用して強制的に待機する
最も簡単な解決策は、ポーリングを使用して、常にスレッド実行の結果を確認することです。
public static void main(String[] args) {
// 启动线程
ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
Thread thread = new Thread(writeFileRunnable);
thread.start();
// 一直等待
while (true) {
if (writeFileRunnable.getLength() == -2) {
// 无结果
continue;
} else {
System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
break;// 直到获取结果结束,此时可以输出文件大小
}
}
}
3.ポーリングの短所
ポーリングを使用すると問題が解決するようですが、実際にはパフォーマンスの無駄です。私たちはテストしました:
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) {
// 无结果
continue;
} else {
System.out.println("循环执行次数:" + i);// 循环执行次数:14365
System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
break;// 直到获取结果结束
}
}
}
つまり、1万回以上調べたのですが、1回しか効果がなかったので、無駄になってしまいました。
4.まとめ
マルチスレッドプログラムでは、ポーリングを使用してスレッドから返されたデータを取得できますが、これはパフォーマンスの無駄になるため、通常、この方法はお勧めしません。