写了一个关于 join 的小程序,发现了一个问题如下
package concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Joining2 { public static void main(String[] args) { //ExecutorService exec = Executors.newCachedThreadPool(); Thread t2 = new Thread(new MusicPlay2()); Thread t1 = new Thread(new MusicPlay1(t2)); //exec.execute(t1); //exec.execute(t2); //exec.shutdown(); t1.start(); t2.start(); } } class MusicPlay1 implements Runnable { private int countDown = 10; private Thread thread; public MusicPlay1(Thread thread) { this.thread = thread; } @Override public void run() { while(true) { try { //TimeUnit.MICROSECONDS.sleep(1000); System.out.println(--countDown); if(countDown == 5) { thread.join(); } if(countDown == 0) { return; } } catch (InterruptedException e) { e.printStackTrace(); } } } } class MusicPlay2 implements Runnable { @Override public void run() { try { TimeUnit.MICROSECONDS.sleep(2000); for (int i = 15; i < 20; i++) { System.out.println(i); } } catch (InterruptedException e) { e.printStackTrace(); } } }运行结果:
9
8
7
6
5
15
16
17
18
19
4
3
2
1
0
如果使用 ExecutorService 运行如下:
package concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Joining2 { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); Thread t2 = new Thread(new MusicPlay2()); Thread t1 = new Thread(new MusicPlay1(t2)); exec.execute(t1); exec.execute(t2); exec.shutdown(); //t1.start(); //t2.start(); } } class MusicPlay1 implements Runnable { private int countDown = 10; private Thread thread; public MusicPlay1(Thread thread) { this.thread = thread; } @Override public void run() { while(true) { try { //TimeUnit.MICROSECONDS.sleep(1000); System.out.println(--countDown); if(countDown == 5) { thread.join(); } if(countDown == 0) { return; } } catch (InterruptedException e) { e.printStackTrace(); } } } } class MusicPlay2 implements Runnable { @Override public void run() { try { TimeUnit.MICROSECONDS.sleep(2000); for (int i = 15; i < 20; i++) { System.out.println(i); } } catch (InterruptedException e) { e.printStackTrace(); } } }运行结果:
9
8
7
6
5
4
3
2
1
0
15
16
17
18
19
目前还不知道原因,以后看看源码。就此记录