在Java中,父子線程的執行順序是不確定的。當一個線程創建另一個線程時,它們之間的執行順序取決于操作系統的調度策略和當前系統的負載情況。因此,你不能保證父線程或子線程會先執行。
如果你需要控制父子線程的執行順序,可以使用以下方法:
Thread.join()
方法:在父線程中調用子線程的join()
方法,這將導致父線程等待子線程完成后再繼續執行。這樣可以確保子線程在父線程之前執行。public class ParentThread extends Thread {
public void run() {
System.out.println("Parent thread started");
ChildThread child = new ChildThread();
child.start();
try {
child.join(); // 等待子線程完成
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Parent thread finished");
}
}
class ChildThread extends Thread {
public void run() {
System.out.println("Child thread started");
System.out.println("Child thread finished");
}
}
synchronized
關鍵字:通過在父子線程之間共享的對象上使用synchronized
關鍵字,可以確保一次只有一個線程訪問共享資源。這樣,你可以控制線程的執行順序。public class SharedResource {
private boolean isChildFinished = false;
public synchronized void childMethod() {
System.out.println("Child thread started");
isChildFinished = true;
notify(); // 喚醒等待的線程
}
public synchronized void parentMethod() {
while (!isChildFinished) {
try {
wait(); // 等待子線程完成
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Parent thread started");
System.out.println("Parent thread finished");
}
}
class ChildThread extends Thread {
private SharedResource sharedResource;
public ChildThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
public void run() {
sharedResource.childMethod();
}
}
public class ParentThread extends Thread {
private SharedResource sharedResource;
public ParentThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
public void run() {
ChildThread child = new ChildThread(sharedResource);
child.start();
sharedResource.parentMethod();
}
}
請注意,這些方法并不能保證絕對的執行順序,但它們可以幫助你更好地控制線程之間的同步和執行順序。