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()方法来等待子线程执行完毕。子线程和主线程是并行执行的,它们之间的执行顺序是不确定的。因此,在编写多线程程序时,需要注意对共享资源的访问和同步,以避免出现意外