线程的创建与启动的注意事项:
1.以下代码执行始终都是A线程先执行再执行B线程;即A线程一创建就开始执行,执行完以后再进行B线程的创建与执行。
new ThreadA(down).start();
new ThreadB(down).start();
2.此代码则不一定是A线程先执行,A线程先创建,处于就绪状态时,B线程创建后可能会先一步抢走CPU,即先一步执行A线程。
Thread A=new ThreadA(down);
Thread B=new ThreadB(down);
A.start();
B.start();
例:
package CutDown;
import java.util.concurrent.CountDownLatch;
public class ThreadA extends Thread{
private CountDownLatch down;
public ThreadA(CountDownLatch down) {
this.down=down;
}
@Override
public void run() {
System.out.println("A");
try {
down.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("C");
}
}
package CutDown;
import java.util.concurrent.CountDownLatch;
public class ThreadB extends Thread{
private CountDownLatch down;
public ThreadB(CountDownLatch down) {
this.down=down;
}
@Override
public void run() {
System.out.println("B");
down.countDown();
}
}
package CutDown;
import java.util.concurrent.CountDownLatch;
public class Test {
public static void main(String[] args) {
CountDownLatch down=new CountDownLatch(1);
//结果始终都是A、B、C
new ThreadA(down).start();
new ThreadB(down).start();
//结果可能是A、B、C,也可能是B、A、C
// Thread A=new ThreadA(down);
// Thread B=new ThreadB(down);
// A.start();
// B.start();
}
}