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