Bootstrap

Java中的线程与C++中的区别

我是先学的C++,后学的Java,发现两者的线程在某些方面还是有很大的区别的,特此写篇文章记录下。

C++ 中的线程

C++ 中的线程如果既没有 ,也没有 的话,在线程对象被销毁时,程序就会被异常终止掉,比如:

void myThread()
{
    while (1)
    {
        cout << "MyThread is running!" << endl;
        this_thread::sleep_for(2s);
    }
}

int main()
{
    thread t (myThread);

    return 0;
}

执行上述程序,输出如下:

terminate called without an active exception
Aborted (core dumped)

解决的办法也很简单,加上语句 或 即可,程序就不会被异常终止掉了。

另外,如果主线程执行结束了,那么其它所有线程都会退出。

Java 中的线程

而在 Java 中,只有当运行的线程都是守护线程时,Java 虚拟机才会退出。在如下代码中:

public class Main {
    public static void main(String[] args) {
        new Thread(() -> {
            while (true) {
                System.out.println("MyThread is running!");
            }
        }).start();
    }
}

即使主线程执行结束了,在主线程中创建的线程也不会退出,因为该线程并不是守护线程。当然,我们也可以在主线程执行结束的时候终止当前正在运行的 Java 虚拟机,这样其它所有线程都会退出了,只要加上语句 即可。

小结

  • 在 C++ 中,线程如果既没有 ,也没有 的话,在线程对象被销毁时,程序就会被异常终止掉。

  • 在 C++ 中,如果主线程执行结束了,那么其它所有线程都会退出。

  • 在 Java 中,只有当运行的线程都是守护线程时,Java 虚拟机才会退出。