以下のようなコードを書いて実行したのですが、乱数がばらばらに表示してしまいます。配列に格納して昇順に出力したいのですが、どなたか解決方法教えてください。
該当コード
java
1import java.util.Calendar; 2import java.text.SimpleDateFormat; 3import java.util.Date; 4import java.util.Arrays; 5import java.util.Random; 6 7class ThreadLearnss extends Thread { 8 public void run() { 9 for (int i = 0; i < 30; i++) { 10 } 11 } 12} 13 14class mains { 15 public static void main(String[] args) { 16 for (int h = 0; h < 30; h++) { 17 Thread[] th = new Thread[30]; 18 Date date = new Date(); 19 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 20 Calendar calendar = Calendar.getInstance(); 21 22 for (Thread s : th) { 23 s.start(); 24 int[] nums; 25 for (int i = 0; i < 30; i++) { 26 th[i] = new Thread(); 27 calendar.setTime(date); 28 nums = new Random().ints(30, 2, 11).toArray(); 29 Date d1 = calendar.getTime(); 30 calendar.add(Calendar.SECOND, nums[i]); 31 Arrays.sort(nums); 32 33 System.out.printf("%d %s %s %s %d %s %s\n", s.getId(), "start", sdf.format(date), "wait", 34 nums[i], sdf.format(d1), "end"); 35 } 36 37 } 38 39 for (Thread t : th) { 40 try { 41 t.join(); 42 } catch (InterruptedException e) { 43 System.out.println(e); 44 } finally { 45 System.out.printf("%s", "program end"); 46 } 47 } 48 } 49 } 50} 51
出力
java
115 start 08:25:53 wait 5 08:25:58 end 216 start 08:25:53 wait 3 08:25:56 end 317 start 08:25:53 wait 5 08:25:58 end 418 start 08:25:53 wait 9 08:26:02 end 519 start 08:25:53 wait 7 08:26:00 end 620 start 08:25:53 wait 8 08:26:01 end 721 start 08:25:53 wait 4 08:25:57 end 822 start 08:25:53 wait 7 08:26:00 end 923 start 08:25:53 wait 6 08:25:59 end 1024 start 08:25:53 wait 2 08:25:55 end 1125 start 08:25:53 wait 2 08:25:55 end 1226 start 08:25:53 wait 4 08:25:57 end 1327 start 08:25:53 wait 2 08:25:55 end 1428 start 08:25:53 wait 7 08:26:00 end 1529 start 08:25:53 wait 6 08:25:59 end 1630 start 08:25:53 wait 7 08:26:00 end 1731 start 08:25:53 wait 10 08:26:03 end 1832 start 08:25:53 wait 9 08:26:02 end 1933 start 08:25:53 wait 2 08:25:55 end 2034 start 08:25:53 wait 6 08:25:59 end 2135 start 08:25:53 wait 9 08:26:02 end 2236 start 08:25:53 wait 7 08:26:00 end 2337 start 08:25:53 wait 10 08:26:03 end 2438 start 08:25:53 wait 7 08:26:00 end 2539 start 08:25:53 wait 4 08:25:57 end 2640 start 08:25:53 wait 8 08:26:01 end 2741 start 08:25:53 wait 4 08:25:57 end 2842 start 08:25:53 wait 9 08:26:02 end 2943 start 08:25:53 wait 3 08:25:56 end 3044 start 08:25:53 wait 8 08:26:01 end 31program end
試したこと
Arrays.sort(nums);とSystem.out.printfをfor文の外に出した。当然ですがSystem.out.printfのnums[i]がエラーになる
追記
java
1import java.util.Calendar; 2import java.text.SimpleDateFormat; 3import java.util.Date; 4import java.util.Arrays; 5import java.util.Random; 6 7class mains { 8 public static void main(String[] args) { 9 Thread[] th = new Thread[30]; 10 Date date = new Date(); 11 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 12 Calendar calendar = Calendar.getInstance(); 13 int[] nums = new Random().ints(30, 2, 11).toArray(); 14 Arrays.sort(nums); 15 for (int i = 0; i < 30; i++) { 16 th[i] = new Thread(); 17 th[i].start(); 18 calendar.setTime(date); 19 Date d1 = calendar.getTime(); 20 calendar.add(Calendar.SECOND, nums[i]); 21 22 System.out.printf("%d %s %s %s %d %s %s\n", th[i].getId(), "start", sdf.format(date), "wait", 23 nums[i], sdf.format(d1), "end"); 24 } 25 26 for (Thread t : th) { 27 try { 28 t.join(); 29 } catch (InterruptedException e) { 30 System.out.println(e); 31 } finally { 32 System.out.printf("%s", "program end"); 33 } 34 } 35 } 36} 37
これはどういう意図のコードなんでしょうか。なぜ Thread を使っているのでしょうか。日本語で説明していただけませんか?
「Arrays.sort(nums);」は 27,000 回実行されるように見えますが、これは意図どおりですか?
何となくコードを書いて動かないと嘆き、質問するのは止めましょう。やりたいこと、ご要望は分からなくもないですが、コードが意図不明です。
すみません、説明不足でした。Threadを30個作って,各スレッドではスレッドのIDを取得,開始時刻を取得,乱数で2から10秒待ち,終了時刻を取得し,スレッドID,開始時刻,待ち秒数,終了時刻を表⽰させるプログラムを作ろうとしているのですが、プログラムの一部しか提示していなかったため、全て提示するように編集します。
乱数の配列のソート云々の前に、ThreadLearnssクラスのスレッドの開始や終了待ちの処理がメチャクチャに見えます。その辺りはデバッグ済みで、意図通り動作しているのでしょうか。
s.start() で止まってそうに見えますが…。
Thread オブジェクトは放置されています。
何もしてない ThreadLearnss は使われていませんし。
乱数で待つってカレンダーに足している部分のことでしょうか。
> s.start() で止まってそうに見えますが…。
ぬるぽですよねえ。
一応デバック済みで大方意図通りの動作はしています。
乱数で待ってカレンダーに足している部分のことですが、乱数表示を昇順に出力したいです。
ThreadLearnssでスレッドID取得させるなど、活用したほうがプログラムとして正しい書き方になりますよね。
Threadオブジェクトを有効に使うにはどうしたらよいでしょうか?

回答2件
あなたの回答
tips
プレビュー