回答編集履歴

3

wait を秒精度化、最後に end を表示

2022/06/21 04:32

投稿

jimbe
jimbe

スコア12668

test CHANGED
@@ -14,12 +14,12 @@
14
14
  Thread[] th = new Thread[10];
15
15
 
16
16
  for (int i=0; i<th.length; i++) {
17
- final long wait = random.nextInt(8001) + 2000; //[ms]
17
+ final int wait = random.nextInt(9) + 2; //[s]
18
18
  th[i] = new Thread(() -> {
19
19
  long id = Thread.currentThread().getId();
20
20
  Date start = new Date();
21
21
  try {
22
- Thread.sleep(wait);
22
+ Thread.sleep(wait * 1000L);
23
23
  } catch(InterruptedException e) {
24
24
  e.printStackTrace();
25
25
  }
@@ -36,6 +36,8 @@
36
36
  e.printStackTrace();
37
37
  }
38
38
  }
39
+
40
+ System.out.println("program end");
39
41
  }
40
42
 
41
43
  private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
@@ -51,14 +53,15 @@
51
53
  }
52
54
  ```
53
55
  ```plain
54
- 18 start=12:31:32 wait=2270 end=12:31:34
55
- 17 start=12:31:32 wait=3194 end=12:31:35
56
- 12 start=12:31:32 wait=5036 end=12:31:37
57
- 15 start=12:31:32 wait=5290 end=12:31:37
58
- 20 start=12:31:32 wait=6555 end=12:31:39
59
- 21 start=12:31:32 wait=7947 end=12:31:40
60
- 16 start=12:31:32 wait=7997 end=12:31:40
61
- 14 start=12:31:32 wait=8015 end=12:31:40
62
- 19 start=12:31:32 wait=9291 end=12:31:41
56
+ 19 start=13:30:46 wait=2 end=13:30:48
63
- 13 start=12:31:32 wait=9742 end=12:31:42
57
+ 21 start=13:30:46 wait=2 end=13:30:48
58
+ 12 start=13:30:46 wait=3 end=13:30:49
59
+ 13 start=13:30:46 wait=5 end=13:30:51
60
+ 20 start=13:30:46 wait=6 end=13:30:52
61
+ 15 start=13:30:46 wait=6 end=13:30:52
62
+ 16 start=13:30:46 wait=9 end=13:30:55
63
+ 17 start=13:30:46 wait=10 end=13:30:56
64
+ 18 start=13:30:46 wait=10 end=13:30:56
65
+ 14 start=13:30:46 wait=10 end=13:30:56
66
+ program end
64
67
  ```

2

修正

2022/06/21 03:52

投稿

jimbe
jimbe

スコア12668

test CHANGED
@@ -1,7 +1,7 @@
1
1
  「Threadを30個作って,各スレッドではスレッドのIDを取得,開始時刻を取得,乱数で2から10秒待ち,終了時刻を取得し,スレッドID,開始時刻,待ち秒数,終了時刻を表⽰させるプログラム」という仕様からは以下のような動作と想像します。(30個という数はテストには意味が無いので10個にしてますが。)
2
2
  しかし作られたコードはそうならず、なんとか動かした結果何かの数字は出てきたので『とりあえず並び替えればそれっぽいのでは』ということで本件に至ったのではないでしょうか。
3
3
 
4
- ちなみに、現在ご提示されているコードをコピペして実行するとやはり s.start() で NullPointerException が発生しますので、tukaさんのお手元で発生していなければ、コードが異なっているものと思います。
4
+ ちなみに、現在ご提示されているコードをコピペして実行するとやはり s.start() で NullPointerException が発生しますので、tukaさんのお手元で発生していなければ、コードが異なっているものと思います。(もしくは、動かしていると思っているコードと実際に動作しているコードが違う?)
5
5
 
6
6
  ```java
7
7
  import java.text.SimpleDateFormat;

1

スレッド ID の取得をスレッド内に移動

2022/06/21 03:43

投稿

jimbe
jimbe

スコア12668

test CHANGED
@@ -16,6 +16,7 @@
16
16
  for (int i=0; i<th.length; i++) {
17
17
  final long wait = random.nextInt(8001) + 2000; //[ms]
18
18
  th[i] = new Thread(() -> {
19
+ long id = Thread.currentThread().getId();
19
20
  Date start = new Date();
20
21
  try {
21
22
  Thread.sleep(wait);
@@ -23,7 +24,7 @@
23
24
  e.printStackTrace();
24
25
  }
25
26
  Date end = new Date();
26
- print(start, wait, end);
27
+ print(id, start, wait, end);
27
28
  });
28
29
  th[i].start();
29
30
  }
@@ -39,9 +40,9 @@
39
40
 
40
41
  private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
41
42
 
42
- private static synchronized void print(Date start, long wait, Date end) {
43
+ private static synchronized void print(long id, Date start, long wait, Date end) {
43
44
  System.out.println(new StringBuilder()
44
- .append(Thread.currentThread().getId())
45
+ .append(id)
45
46
  .append(" start=").append(sdf.format(start))
46
47
  .append(" wait=").append(wait)
47
48
  .append(" end=").append(sdf.format(end))