回答編集履歴
3
wait を秒精度化、最後に end を表示
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
|
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=1
|
56
|
+
19 start=13:30:46 wait=2 end=13:30:48
|
63
|
-
1
|
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
修正
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 の取得をスレッド内に移動
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(
|
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))
|