実行するスレッドを10個作成したプログラムがあります。完了する前にすべてが完了するまで、メインスレッドが待機するようにします。 .joinコマンドを使用しようとしていますが、動作していないようです。また、すべてのスレッドのランタイムを表示しようとしていますが、正しく動作していません。以下は私のコードです。メインスレッドがすべてのスレッドが完了するのを待つ方法
//File: CohanThread.java
//Author: Ryan A. Cohan
//Date: August 4, 2016
//Purpose: To create, run, and analyze a thread based program. IOBound runs IO intensive
//operations in the form of printing 1000 times to the console. CPUBound runs CPU
//intensive operations by computing an equation and printing 1000 times.
package cohanthread;
import java.text.*;
public class CohanThread{
public static void main(String args[]) throws InterruptedException{
NumberFormat formatter = new DecimalFormat("#0.00000");
IOBound io1 = new IOBound();
IOBound io2 = new IOBound();
IOBound io3 = new IOBound();
IOBound io4 = new IOBound();
IOBound io5 = new IOBound();
CPUBound cpu1 = new CPUBound();
CPUBound cpu2 = new CPUBound();
CPUBound cpu3 = new CPUBound();
CPUBound cpu4 = new CPUBound();
CPUBound cpu5 = new CPUBound();
long scheduleStart = System.currentTimeMillis();
io1.start();
io2.join();
io3.join();
io4.join();
io5.join();
cpu1.join();
cpu2.join();
cpu3.join();
cpu4.join();
cpu5.join();
long scheduleEnd = System.currentTimeMillis();
System.out.println("Runtime of all threads: " + formatter.format((scheduleEnd - scheduleStart)/1000d));
System.out.println("Processes complete.");
}
}
class IOBound extends Thread{
NumberFormat formatter = new DecimalFormat("#0.00000");
@Override
public void run(){
long start = System.currentTimeMillis();
for(int i = 0; i < 1000; i++){
System.out.println("Thread number is: " + i);
}
long end = System.currentTimeMillis();
System.out.println("IO Thread runtime: " + formatter.format((end - start)/1000d));
}
}
class CPUBound extends Thread{
NumberFormat formatter = new DecimalFormat("#0.00000");
@Override
public void run(){
String binary = "";
long start = System.currentTimeMillis();
for(int i = 0; i < 1000; i++){
while(i > 0){
int remainder = i % 2;
binary = remainder + binary;
i = i/2;
}
System.out.println("Binary number: " + binary);
long end = System.currentTimeMillis();
System.out.println("CPU Thread runtime: " + formatter.format((end - start)/1000d));
}
}
}
"動作していないようです" --- 'join()'は指定どおりに動作します。 –
あなたは未起動のスレッドに参加していますか?それ以外:「うまくいかない」というのは、十分なエラー記述ではありません。あなたが観察するものとは対照的に、あなたが期待するものを提供してください。 – Fildor
あなたは1つのスレッドを開始し、実際に起動したスレッド以外のすべてのスレッドに参加します。 –