Skip to content

Commit 97178a8

Browse files
authored
修改join示例代码
原po代码个人感觉有些歧义
1 parent 087b9f9 commit 97178a8

File tree

1 file changed

+63
-42
lines changed

1 file changed

+63
-42
lines changed

2.线程的状态转换以及基本操作/线程状态转换以及基本操作.md

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ interrupted()对当前线程进行中断操作,该方法会清除中断标
132132
## 3.2. join ##
133133

134134
join方法可以看做是线程间协作的一种方式,很多时候,一个线程的输入可能非常依赖于另一个线程的输出,这就像两个好基友,一个基友先走在前面突然看见另一个基友落在后面了,这个时候他就会在原处等一等这个基友,等基友赶上来后,就两人携手并进。其实线程间的这种协作方式也符合现实生活。在软件开发的过程中,从客户那里获取需求后,需要经过需求分析师进行需求分解后,这个时候产品,开发才会继续跟进。如果一个线程实例A执行了threadB.join(),其含义是:当前线程A会等待threadB线程终止后threadA才会继续执行(**“主线程”等待“子线程”结束之后才能继续运行。**)。关于join方法一共提供如下这些方法:
135-
> public final synchronized void join(long millis)
136-
> public final synchronized void join(long millis, int nanos)
137-
> public final void join() throws InterruptedException
135+
> public final synchronized void join(long millis)</br>
136+
> public final synchronized void join(long millis, int nanos)</br>
137+
> public final void join() throws InterruptedException</br>
138138
139139
Thread类除了提供join()方法外,另外还提供了超时等待的方法,如果线程threadB在等待的时间内还没有结束的话,threadA会在超时之后继续执行。join方法源码关键是:
140140

@@ -144,48 +144,69 @@ Thread类除了提供join()方法外,另外还提供了超时等待的方法
144144

145145
可以看出来当前等待对象threadA会一直阻塞,直到被等待对象threadB结束后即isAlive()返回false的时候才会结束while循环,当threadB退出时会调用notifyAll()方法通知所有的等待线程。下面用一个具体的例子来说说join方法的使用:
146146

147-
public class JoinDemo {
148-
public static void main(String[] args) {
149-
Thread previousThread = Thread.currentThread();
150-
for (int i = 0; i <= 10; i++) {
151-
Thread curThread = new JoinThread(previousThread);
152-
curThread.start();
153-
previousThread = curThread;
154-
}
155-
}
156-
157-
static class JoinThread extends Thread {
158-
private Thread thread;
159-
160-
public JoinThread(Thread thread) {
161-
this.thread = thread;
162-
}
163-
164-
@Override
165-
public void run() {
166-
try {
167-
thread.join();
168-
System.out.println(thread.getName() + " terminated.");
169-
} catch (InterruptedException e) {
170-
e.printStackTrace();
171-
}
172-
}
173-
}
174-
}
147+
public class JoinDemo {
148+
public static void main(String[] args) throws InterruptedException {
149+
for (int i = 0; i <= 10; i++) {
150+
MyThread thread = new MyThread();
151+
thread.start();
152+
try {
153+
thread.join();
154+
} catch (InterruptedException e) {
155+
e.printStackTrace();
156+
}
157+
System.out.println("主线程执行完毕");
158+
System.out.println("~~~~~~~~~~~~~~~");
159+
}
160+
}
161+
162+
static class MyThread extends Thread {
163+
@Override
164+
public void run() {
165+
try {
166+
Thread.sleep(1000);
167+
} catch (InterruptedException e) {
168+
e.printStackTrace();
169+
}
170+
System.out.println("子线程执行完毕");
171+
}
172+
}
173+
}
175174

176175
输出结果为:
177176

178-
> main terminated.
179-
> Thread-0 terminated.
180-
> Thread-1 terminated.
181-
> Thread-2 terminated.
182-
> Thread-3 terminated.
183-
> Thread-4 terminated.
184-
> Thread-5 terminated.
185-
> Thread-6 terminated.
186-
> Thread-7 terminated.
187-
> Thread-8 terminated.
188-
> Thread-9 terminated.
177+
子线程执行完毕
178+
主线程执行完毕
179+
~~~~~~~~~~~~~~~
180+
子线程执行完毕
181+
主线程执行完毕
182+
~~~~~~~~~~~~~~~
183+
子线程执行完毕
184+
主线程执行完毕
185+
~~~~~~~~~~~~~~~
186+
子线程执行完毕
187+
主线程执行完毕
188+
~~~~~~~~~~~~~~~
189+
子线程执行完毕
190+
主线程执行完毕
191+
~~~~~~~~~~~~~~~
192+
子线程执行完毕
193+
主线程执行完毕
194+
~~~~~~~~~~~~~~~
195+
子线程执行完毕
196+
主线程执行完毕
197+
~~~~~~~~~~~~~~~
198+
子线程执行完毕
199+
主线程执行完毕
200+
~~~~~~~~~~~~~~~
201+
子线程执行完毕
202+
主线程执行完毕
203+
~~~~~~~~~~~~~~~
204+
子线程执行完毕
205+
主线程执行完毕
206+
~~~~~~~~~~~~~~~
207+
子线程执行完毕
208+
主线程执行完毕
209+
~~~~~~~~~~~~~~~
189210
190211
在上面的例子中一个创建了10个线程,每个线程都会等待前一个线程结束才会继续运行。可以通俗的理解成接力,前一个线程将接力棒传给下一个线程,然后又传给下一个线程......
191212

0 commit comments

Comments
 (0)