Skip to content

Commit 20bc629

Browse files
tapankavasthiTapan Avasthi
andauthored
BAEL-6627: How to start a thread using an anonymous class (eugenp#14314)
Co-authored-by: Tapan Avasthi <[email protected]>
1 parent daef3dd commit 20bc629

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.baeldung.concurrent.anonymousthread;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.IOException;
5+
import java.io.PrintStream;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import static org.junit.Assert.assertEquals;
10+
11+
import org.junit.After;
12+
import org.junit.AfterClass;
13+
import org.junit.Before;
14+
import org.junit.BeforeClass;
15+
import org.junit.Test;
16+
17+
public class AnonymousThreadUnitTest {
18+
static ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
19+
static PrintStream printStream = new PrintStream(outputStream);
20+
static List<String> expectedNumbers = new ArrayList<>();
21+
22+
@BeforeClass
23+
public static void setupClass() {
24+
for (int i = 1; i <= 10; i++) {
25+
expectedNumbers.add(String.valueOf(i));
26+
}
27+
}
28+
29+
@Before
30+
public void setupMethod() {
31+
System.setOut(printStream);
32+
}
33+
34+
@After
35+
public void cleanUpMethod() {
36+
outputStream.reset();
37+
System.setOut(System.out);
38+
}
39+
40+
@AfterClass
41+
public static void cleanupClass() throws IOException {
42+
expectedNumbers.clear();
43+
outputStream.close();
44+
printStream.close();
45+
}
46+
47+
@Test
48+
public void givenAnonymousThreadSubclassOverridingRunMethod_whenStart_thenRunAsExpected() {
49+
Thread anonymousThread = new Thread() {
50+
@Override
51+
public void run() {
52+
printNumbersFrom1To10();
53+
}
54+
};
55+
anonymousThread.start();
56+
waitForThreadToFinish();
57+
anonymousThread.interrupt();
58+
59+
String[] printedNumbers = getPrintedNumbers();
60+
assertEquals(expectedNumbers, List.of(printedNumbers));
61+
}
62+
63+
@Test
64+
public void givenAnonymousThreadWithLambdaExpression_whenStart_thenRunAsExpected() {
65+
Thread anonymousThread = new Thread(() -> {
66+
printNumbersFrom1To10();
67+
});
68+
69+
anonymousThread.start();
70+
waitForThreadToFinish();
71+
anonymousThread.interrupt();
72+
73+
String[] printedNumbers = getPrintedNumbers();
74+
assertEquals(expectedNumbers, List.of(printedNumbers));
75+
}
76+
77+
@Test
78+
public void givenAnonymousThreadWithRunnableObject_whenStart_thenRunAsExpected() {
79+
Thread anonymousThread = new Thread(new Runnable() {
80+
@Override
81+
public void run() {
82+
printNumbersFrom1To10();
83+
}
84+
});
85+
anonymousThread.start();
86+
waitForThreadToFinish();
87+
anonymousThread.interrupt();
88+
89+
String[] printedNumbers = getPrintedNumbers();
90+
assertEquals(expectedNumbers, List.of(printedNumbers));
91+
}
92+
93+
private void printNumbersFrom1To10() {
94+
for (int i = 1; i <= 10; i++) {
95+
System.out.println(i);
96+
}
97+
}
98+
99+
private void waitForThreadToFinish() {
100+
try {
101+
Thread.sleep(1000);
102+
} catch (InterruptedException e) {
103+
// ignore
104+
}
105+
}
106+
107+
private String[] getPrintedNumbers() {
108+
String printedOutput = outputStream.toString()
109+
.trim();
110+
return printedOutput.split(System.lineSeparator());
111+
}
112+
}

0 commit comments

Comments
 (0)