Java子线程与主线程的关系
在Java多线程编程中,子线程和主线程是并行执行的。子线程可以对主线程产生影响,而主线程也可以对子线程产生影响。
子线程对主线程的影响
子线程可以通过修改共享变量的值来影响主线程。当子线程修改了一个共享变量的值后,主线程在后续的执行中可以读取到这个新的值。
下面是一个简单的示例代码,演示了子线程对主线程的影响:
class MyThread implements Runnable {
private int count;
public void run() {
count = 5; // 子线程修改共享变量的值
}
public int getCount() {
return count;
}
}
public class MainThread {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 主线程会等待子线程执行完毕再继续执行
thread.join();
int count = myThread.getCount();
System.out.println("Count: " + count); // 输出结果为 "Count: 5"
}
}
在上面的示例代码中,子线程修改了count
变量的值为5,主线程通过调用myThread.getCount()
方法读取到了这个新的值。
主线程对子线程的影响
主线程可以通过调用子线程的join()
方法来影响子线程。join()
方法会使主线程等待子线程执行完毕再继续执行。
下面是一个示例代码,演示了主线程对子线程的影响:
public class MainThread {
public static void main(String[] args) throws InterruptedException {
Thread childThread = new Thread(() -> {
System.out.println("Child thread started");
try {
Thread.sleep(2000); // 子线程睡眠2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Child thread finished");
});
childThread.start();
// 主线程调用子线程的join()方法,等待子线程执行完毕
childThread.join();
System.out.println("Main thread finished");
}
}
在上面的示例代码中,主线程通过调用子线程的join()
方法,等待子线程执行完毕后再输出"Main thread finished"。
子线程与主线程并行执行
子线程和主线程是并行执行的,它们之间的执行顺序是不确定的。下面是一个示例代码,展示了子线程和主线程并行执行的情况:
public class MainThread {
public static void main(String[] args) throws InterruptedException {
Thread childThread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Child thread: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
childThread.start();
for (int i = 0; i < 5; i++) {
System.out.println("Main thread: " + i);
Thread.sleep(1000);
}
System.out.println("Main thread finished");
}
}
在上面的示例代码中,子线程和主线程都分别输出了5次计数,它们之间的输出顺序是不确定的。甘特图如下所示:
gantt
dateFormat HH:mm:ss.SSS
section 子线程与主线程并行执行
子线程: 00:00:00.000, 00:00:05.000
主线程: 00:00:01.000, 00:00:06.000
结论
在Java多线程编程中,子线程和主线程可以相互影响。子线程可以通过修改共享变量的值来影响主线程,而主线程可以通过调用子线程的join()
方法来等待子线程执行完毕。子线程和主线程是并行执行的,它们之间的执行顺序是不确定的。因此,在编写多线程程序时,需要注意对共享资源的访问和同步,以避免出现意外