通俗的讲, 进程
是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位(比如QQ是个进程、微信是个进程)
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
**协程是一种用户态的轻量级线程**
,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。在Java中使用协程,一般会用到kilim( https://github.com/kilim/kilim )这个框架。因此本文不做讨论
/**
* @author fangshixiang@vipkid.com.cn
* @description
* @date 2018-11-05 14:32
*/
public class Main {
public static void main(String[] args) {
System.out.println("主线程启动。。。。");
Thread thread = new Thread(new ChildThread());
thread.start();
System.out.println("主线程结束。。。。");
}
}
class ChildThread implements Runnable {
@Override
public void run() {
try {
System.out.println("子线程启动。。。。");
Thread.sleep(5000);
System.out.println("子线程结束。。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出:
主线程启动。。。。
主线程结束。。。。
子线程启动。。。。
子线程结束。。。。
thiredThread.setDaemon(true);
只需要把子线程设置为守护线程即可
thread.join();
只需要把子线程自动后,join一下就行了
这里使用了join()方法,让主线程等待子线程结束,然后主线程继续执行。这里join()方法必须要在子线程启动之后,再调用。
子线程与主线程的通信,一般在Android中使用,因此本文也不作为重点进行讨论
进程是资源分配的基本单位,线程是cpu调度的基本单位。
但是上面通过调用JVM提供的接口,例如setDaemon与join改变了主线程与子线程的关系,这些应该是JVM接口代码做了处理干扰了线程的生命周期。
对于cpu来说,其实不存在主线程和子线程之分,都是线程(JVM提供的API可能会改变线程的生命周期)。 守护线程与非守护线程本质上没什么区别,但是如果虚拟机中存活的线程都是守护线程的时候,虚拟机就会退出,只要虚拟机中还有一个非守护线程,虚拟机就不会退出。