Skip to content

Commit e16d7bb

Browse files
committed
finish homework of week_04
1 parent e8222b1 commit e16d7bb

File tree

2 files changed

+196
-0
lines changed

2 files changed

+196
-0
lines changed

03concurrency/01thread/pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.github.concurrency</groupId>
8+
<artifactId>con-thread</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
<dependencies>
12+
<dependency>
13+
<groupId>junit</groupId>
14+
<artifactId>junit</artifactId>
15+
<version>4.12</version>
16+
</dependency>
17+
</dependencies>
18+
19+
20+
</project>
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package com.github.thread;
2+
3+
import org.junit.Test;
4+
5+
import java.util.concurrent.*;
6+
import java.util.concurrent.atomic.AtomicInteger;
7+
8+
/**
9+
* 本周作业:(必做)思考有多少种方式,在main函数启动一个新线程或线程池,
10+
* 异步运行一个方法,拿到这个方法的返回值后,退出主线程?
11+
* 写出你的方法,越多越好,提交到github。
12+
* <p>
13+
* 一个简单的代码参考:
14+
*/
15+
public class Homework03 {
16+
17+
public static void main(String[] args) {
18+
19+
long start = System.currentTimeMillis();
20+
// 在这里创建一个线程或线程池,
21+
new Thread(new Runnable() {
22+
@Override
23+
public void run() {
24+
}
25+
}).start();
26+
// 异步执行 下面方法
27+
int result = sum(); //这是得到的返回值
28+
29+
// 确保 拿到result 并输出
30+
System.out.println("异步计算结果为:" + result);
31+
32+
System.out.println("使用时间:" + (System.currentTimeMillis() - start) + " ms");
33+
34+
// 然后退出main线程
35+
36+
}
37+
38+
/**
39+
* 使用join,子线程通过join确保执行
40+
*/
41+
@Test
42+
public void test01() {
43+
AtomicInteger integer = new AtomicInteger();
44+
45+
Thread thread = new Thread(() -> integer.set(sum()));
46+
thread.start();
47+
try {
48+
thread.join();
49+
} catch (InterruptedException e) {
50+
e.printStackTrace();
51+
}
52+
// 确保 拿到result 并输出
53+
System.out.println("异步计算结果为:" + integer.get());
54+
}
55+
56+
// 主线程sleep 1秒钟,把cpu让给子线程执行
57+
@Test
58+
public void test02() {
59+
AtomicInteger integer = new AtomicInteger();
60+
61+
Thread thread = new Thread(() -> integer.set(sum()));
62+
thread.start();
63+
try {
64+
Thread.sleep(1000);
65+
} catch (InterruptedException e) {
66+
e.printStackTrace();
67+
}
68+
69+
// 确保 拿到result 并输出
70+
System.out.println("异步计算结果为:" + integer.get());
71+
}
72+
73+
// futureTask,获取线程返回值,但是会阻塞
74+
@Test
75+
public void test03() {
76+
int result = 0;
77+
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
78+
@Override
79+
public Integer call() throws Exception {
80+
return sum();
81+
}
82+
});
83+
84+
Thread thread = new Thread(futureTask);
85+
thread.start();
86+
try {
87+
// futureTask.get()会阻塞
88+
result = futureTask.get();
89+
} catch (InterruptedException e) {
90+
e.printStackTrace();
91+
} catch (ExecutionException e) {
92+
e.printStackTrace();
93+
}
94+
System.out.println("异步计算结果为:" + result);
95+
}
96+
97+
// 主线程wait让给子线程执行,完了之后再唤醒
98+
@Test
99+
public void test04() {
100+
AtomicInteger atomicInteger = new AtomicInteger();
101+
new Thread(() -> atomicInteger.set(sum())).start();
102+
synchronized (this) {
103+
try {
104+
this.wait(1000);
105+
} catch (InterruptedException e) {
106+
e.printStackTrace();
107+
}
108+
}
109+
System.out.println("异步计算结果为:" + atomicInteger.get());
110+
synchronized (this) {
111+
this.notify();
112+
}
113+
}
114+
115+
//CountDownLatch
116+
@Test
117+
public void test05() {
118+
AtomicInteger atomicInteger = new AtomicInteger();
119+
CountDownLatch countDownLatch = new CountDownLatch(1);
120+
new Thread(() -> {
121+
atomicInteger.set(sum());
122+
countDownLatch.countDown();
123+
}).start();
124+
125+
try {
126+
countDownLatch.await(1000, TimeUnit.MILLISECONDS);
127+
} catch (InterruptedException e) {
128+
e.printStackTrace();
129+
} finally {
130+
}
131+
System.out.println("异步计算结果为:" + atomicInteger.get());
132+
133+
}
134+
135+
//CyclicBarrier
136+
@Test
137+
public void test06() {
138+
AtomicInteger atomicInteger = new AtomicInteger();
139+
CyclicBarrier barrier = new CyclicBarrier(2);
140+
new Thread(() -> {
141+
atomicInteger.set(sum());
142+
try {
143+
barrier.await();
144+
} catch (InterruptedException e) {
145+
e.printStackTrace();
146+
} catch (BrokenBarrierException e) {
147+
e.printStackTrace();
148+
}
149+
}).start();
150+
151+
try {
152+
barrier.await();
153+
} catch (InterruptedException | BrokenBarrierException e) {
154+
e.printStackTrace();
155+
} finally {
156+
}
157+
System.out.println("异步计算结果为:" + atomicInteger.get());
158+
159+
}
160+
161+
//CyclicBarrier
162+
@Test
163+
public void test07() {
164+
165+
}
166+
167+
private static int sum() {
168+
return fibo(36);
169+
}
170+
171+
private static int fibo(int a) {
172+
if (a < 2)
173+
return 1;
174+
return fibo(a - 1) + fibo(a - 2);
175+
}
176+
}

0 commit comments

Comments
 (0)