C++/Java线程之分

JAVA线程状态图

1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭)。

----1.1 一个进程中可以有很多的线程,可以在主线程上创建一个新线程(A),而在这个新线程(A)中可以再创建别的线程。这样的话,线程之间就可以层层嵌套;

     CreateTread()函数中就有一个参数可以指定创建线程的入口(就是可以自定义一个线程启动入口),

----1.2 当父线程消亡的时候,子线程是不会消亡的,是会继续执行到结束的;

----1.3 当主线程消亡的时候,所有线程都得死。

2.Java中线程分为守护线程(如垃圾回收线程)和非守护线程(默认为非守护线程/用户线程),通过              setDaemon(true)方法将非守护线程变为守护线程;

----2.1默认情况下主线程结束,子线程未结束时,程序不结束;

package base;

class ThreadTest extends Thread {
	ThreadTest() {
        super("Demo Thread");
        System.out.println("Child thread: " + this);
        start();
    }

    @Override
    public void run() {
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Child Thread: " + i);
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Child Interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
//NOTE:主线程退出之后子线程仍然可以继续运行
//NOTE:非守护线程
public class NewThread {
    public static void main(String[] args) {
        new ThreadTest();
        System.out.println("Main thread exiting.");
    }
}

结果如下图所示:

----2.2当子线程为守护线程时,主线程结束则其他子线程也结束,程序结束;

class ThreadTest extends Thread {
	ThreadTest() {
        super("Demo Thread");
        System.out.println("Child thread: " + this);
        
        //将子线程t设置为守护线程
        setDaemon(true); 
        
        start();
    }

    @Override
    public void run() {
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Child Thread: " + i);
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Child Interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
//NOTE:主线程退出之后子线程仍然可以继续运行
//NOTE:非守护线程
public class NewThread {
    public static void main(String[] args) {
        new ThreadTest();
        
        System.out.println("Main thread exiting.");
    }
}

结果如下图所示:

两个区别在于

  1. JVM会在所有的非守护线程(用户线程)执行完毕后退出;
  2. main线程是用户线程;
  3. 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
posted @ 2018-12-18 02:04  jadeshu  阅读(351)  评论(0编辑  收藏  举报