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.");
}
}
结果如下图所示:

两个区别在于
- JVM会在所有的非守护线程(用户线程)执行完毕后退出;
- main线程是用户线程;
- 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
C++/Java线程之分的更多相关文章
- Java线程之 InterruptedException 异常
Java线程之 InterruptedException 异常 当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...
- Java线程之synchronized
翻译:https://www.journaldev.com/1061/thread-safety-in-java 我们知道线程安全在Java中是一个非常重要的主题,当多个线程操作共享数据时,如果没有任 ...
- Java线程之wait()、notify()、notifyAll()
翻译:https://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 简述 java中Objct对象包含三个 ...
- Java线程之Phaser
Phaser是一个灵活的线程同步工具,他包含了CyclicBarrier和CountDownLatch的相关功能 首先,来看一下如何用Phaser替代CountDownLatch.对于CountDow ...
- java 线程之executors线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
- java 线程之concurrent中的常用工具 CyclicBarrier
一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...
- Java线程之CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...
- Java线程之Synchronized用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...
- Java线程之Java内存模型(jmm)
一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial
随机推荐
- iOS-静态库,动态库,framework浅析(三)
创建framework静态库 第一步,新建项目 新建项目.png 第二步,删除系统默认创建的[FMDB.h]和[FMDB.m]文件,导入需要打包的源文件. 导入源码后的工程.png 第三步,修改项目配 ...
- [knowledge] big data things
http://hadoop.apache.org/ https://spark.apache.org/ https://nifi.apache.org/ https://www.cloudera.co ...
- Servlet重写init(ServletConfig config)还是init()
原文地址:Servlet重写init(ServletConfig config)还是init() 写一个Servlet时,有时需要我们重写该Servlet的初始化方法,然后,究竟是重写init(Ser ...
- AES加解密所遇问题
AES加解密后解密数据末尾携带多余空格,经查看是由于加密时数据不足16个字节自动补齐导致 解决办法:记录加密数据长度,解密后根据数据长度读取解密数据. 另外加密数据中可能存在0等数据,所以拷贝内容时最 ...
- TZOJ 5640: 数据结构实验:仓库管理
描述 某百货公司仓库中有一批电视机,按其价格严格从低到高的次序,以链表(链表含头结点)的形式存储于计算机中,链表的每个结点表示同样价格的电视机台数.现在又有m台价格为x元的电视机准备入库,请将其加入到 ...
- Web前端性能优化策略
前端性能优化需要从前端的资源类型分析,以减少请求资源和请求时间为目的.目前的类型包括图片.javascript.css.动态数据等,不同的资源对于运算.带宽等的依赖也不同,因此优化的方式也不同.参照以 ...
- java安全删除一个文件,防止工具恢复数据
解决移动端文件删除的安全问题:file.delect() Java 确保安全删除某个文件 http://outofmemory.cn/code-snippet/14222/Java-securit ...
- 20170728 Celery项目 后台处理SQL SERVER的一个异常
-- 1. 感觉是访问DB 失败了,失败原因不明确 -- 2. 考虑解决问题的解决办法,后台记录异常,并重新发送任务. 具体如何来实现
- strlen函数细节
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: ...
- LaTeX使用学习
LaTeX是什么? 文档结构 标点符号 行内公式$\oint\sqrt{a}$ 行间公式 \begin{equation}\label{a}\oint\sqrt{a}\end{equation}