什么是线程?什么是进程?为什么要有线程?有什么关系与区别?


参考答案

进程:

  • 程序执行时的一个实例
  • 每个进程都有独立的内存地址空间
  • 系统进行资源分配和调度的基本单位
  • 进程里的堆,是一个进程中最大的一块内存,被进程中的所有线程共享的,进程创建时分配,主要存放 new 创建的对象实例
  • 进程里的方法区,是用来存放进程中的代码片段的,是线程共享的
  • 在多线程 OS 中,进程不是一个可执行的实体,即一个进程至少创建一个线程去执行代码


      
为什么要有线程?

      每个进程都有自己的地址空间,即进程空间。一个服务器通常需要接收大量并发请求,为每一个请求都创建一个进程系统开销大、请求响应效率低,因此操作系统引进线程。      

 


线程:

  • 进程中的一个实体
  • 进程的一个执行路径
  • CPU 调度和分派的基本单位
  • 线程本身是不会独立存在
  • 当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行
  • 系统不会为线程分配内存,线程组之间只能共享所属进程的资源
  • 线程只拥有在运行中必不可少的资源(如程序计数器、栈)
  • 线程里的程序计数器就是为了记录该线程让出 CPU 时候的执行地址,待再次分配到时间片时候就可以从自己私有的计数器指定地址继续执行
  • 每个线程有自己的栈资源,用于存储该线程的局部变量和调用栈帧,其它线程无权访问

 

      
关系:

  • 一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源
  • Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程
  • 一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器,栈区域

如下图

      


区别:

  •  本质:进程是操作系统资源分配的基本单位;线程是任务调度和执行的基本单位
  •  内存分配:系统在运行的时候会为每个进程分配不同的内存空间,建立数据表来维护代码段、堆栈段和数据段;除了 CPU 外,系统不会为线程分配内存,线程所使用的资源来自其所属进程的资源
  • 资源拥有:进程之间的资源是独立的,无法共享;同一进程的所有线程共享本进程的资源,如内存,CPU,IO 等
  •  开销:每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行程序计数器和栈,线程之间切换的开销小
  • 通信:进程间 以IPC(管道,信号量,共享内存,消息队列,文件,套接字等)方式通信 ;同一个进程下,线程间可以共享全局变量、静态变量等数据进行通信,做到同步和互斥,以保证数据的一致性
  • 调度和切换:线程上下文切换比进程上下文切换快,代价小
  • 执行过程:每个进程都有一个程序执行的入口,顺序执行序列;线程不能够独立执行,必须依存在应用程序中,由程序的多线程控制机制控制
  • 健壮性:每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题,如死锁等
  • 可维护性:线程的可维护性,代码也较难调试,bug 难排查


进程与线程的选择:

  • 需要频繁创建销毁的优先使用线程。因为进程创建、销毁一个进程代价很大,需要不停的分配资源;线程频繁的调用只改变 CPU 的执行
  • 线程的切换速度快,需要大量计算,切换频繁时,用线程
  • 耗时的操作使用线程可提高应用程序的响应
  • 线程对 CPU 的使用效率更优,多机器分布的用进程,多核分布用线程
  • 需要跨机器移植,优先考虑用进程
  • 需要更稳定、安全时,优先考虑用进程
  • 需要速度时,优先考虑用线程
  • 并行性要求很高时,优先考虑用线程

 

Java 编程语言中线程是通过 java.lang.Thread 类实现的。

Thread 类中包含 tid(线程id)、name(线程名称)、group(线程组)、daemon(是否守护线程)、priority(优先级) 等重要属性。

 


微信小程序

  • 基础与语法
    • JDK和JRE有什么区别?
    • ==和equals的区别是什么?
    • 基本类型和包装类对象使用 == 和 equals进行比较的结果?
    • 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?
    • hashCode()相同,equals()也一定为true吗?
    • final在java中的作用
    • final finally finalize()区别
    • finally语句块一定执行吗?
    • final与static的区别
    • return与finally的执行顺序对返回值的影响
    • String对象中的replace和replaceAll的区别?
    • Math.round(-1.5) 等于多少?
    • String属于基础的数据类型吗?
    • java中操作字符串都有哪些类?它们之间有什么区别?
    • 如何将字符串反转?
    • String类的常用方法有哪些?
    • 普通类和抽象类有哪些区别?
    • 抽象类必须要有抽象方法吗?
    • 抽象类能使用final修饰吗?
    • 接口和抽象类有什么区别?
    • Java访问修饰符有哪些?权限的区别?
    • Java中的 << << >>> 是什么?
    • javap的作用是什么?
    • throw和throws的区别?
    • try-catch-finally中哪个部分可以省略?
    • 常见的异常类有哪些?
    • 什么是JAVA内部类?
    • nio中的Files类常用方法有哪些?
    • 什么是反射?有什么作用?
    • 动态代理是什么?应用场景?
    • 怎么实现动态代理?
    • 什么是java序列化?什么情况下需要序列化?
    • 什么场景要对象克隆?
    • 深拷贝和浅拷贝区别是什么?
    • 如何实现对象克隆与深拷贝?
    • Java跨平台运行的原理
    • Java的安全性体现在哪里?
    • Java针对不同的应用场景提供了哪些版本?
    • 什么是JVM?
    • 什么是JDK?
    • 什么是JRE?
    • JDK、JRE、JVM之间的关系是什么样的?
    • Java语言有哪些注释的方式?
    • Java中有几种基本数据类型?它们分别占多大字节?
    • i++和++i的作用和区别
    • &和&&的作用和区别
    • |和||的作用和区别
    • 如何让计算机最高效的算出2乘以8?
    • Java中基本类型的转换规则
    • if-else-if-else与switch的区别
    • while和do-while的区别
    • break语句的作用
    • continue语句的作用
    • Java中数组有什么特征?
    • 可变参数的作用和特点是什么?
    • 类和对象的关系
    • 说一说你的对面向过程和面向对象的理解
    • 方法重载和重写是什么?有什么区别?
    • this和super关键字的作用
    • static关键字的作用是什么?
    • abstract关键字的作用是什么?
    • java.lang.Object的常用方法?
    • 子类构造方法的执行过程是什么样的?
    • ==和equals的区别是什么?
    • 什么是Java的多态?
    • instanceof关键字的作用是什么?
    • 什么是Java的垃圾回收机制?
    • 什么是包装类?为什么要有包装类?基本类型与包装类如何转换?
    • 基本类型和包装类的区别?
    • java.sql.Date和java.util.Date的区别
    • 关于Java编译,下面哪一个正确()
    • 关于构造方法,下列说法正确的是()
    • Java中接口的修饰符可以是()
    • 以下代码将输出()
    • 关于关键字的使用说法错误的是()
    • 关于内存回收正确的是()
    • 哪些标识符合法?
    • 说法正确的是()
    • 定义一个Java类,可被所有类访问,申明正确的是()
    • 说说你对面向对象的理解
    • 内存泄漏和内存溢出的区别
    • 不通过构造方法能创建对象吗?
    • 匿名内部类可以继承类或实现接口吗?为什么?
    • 什么是多态?如何实现?有什么好处?
    • Java中关于继承,错误的是()
    • Math.random()的返回值是多少?
    • 同步代码块和同步方法有什么区别?
    • 内部类和静态内部类有什么区别?
    • 下列运算符合法的是()
    • 打印值是多少?
    • 关于抽象,正确的是()
    • 正确的是()
    • 正确的是()
    • 错误的是()
    • 哪些不能修饰 interface
    • 正确是的()
    • 存在i+1< i的数吗?为什么?
    • 接口可否继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?
    • 可序列化对象为什么要定义serialversionUID值?
    • 十进制100转换成八进制是多少?
    • Class类的getDeclaredFields()与getFields()方法的区别?
    • final修饰变量,是引用不能变?还是引用的对象不能变?
    • 解释以下正则表达式的含义
    • 声明合法的是()
    • 下面打印结果是?
    • Java属于编译型还是解释型语言?
    • 如果有两个类A、B(注意不是接口),如何编写C类同时使用这两个类的功能?
    • 构造方法是否可以被重载?重写?
    • 基本类型byte表示的数值范围是多少?
    • 日期类型如何格式化?字符串如何转日期?
    • 当输入为2的时候返回值是
    • System.out.println('a'+1);的结果是
    • 静态与非静态成员变量区别?
    • 二进制数,小数点向右移一位,值会发生什么变化?
    • 下面两段代码的区别是?
    • swtich能否作用在byte、long、String上?
    • 在Java 中,如何跳出当前的多重嵌套循环?
    • 为什么不能根据返回类型来区分方法重载?
    • Inner Class和Static Nested Class的区别?
    • abstract方法是否可是static的?native的?synchronized的?
    • 静态方法内部能对非静态调用吗?
    • 内部类可以引用它的外部类的成员吗?有什么限制?
    • 打印结果是什么
    • 说说字符串与基本数据之间的转换
    • GB2312编码的字符串如何转换为ISO-8859-1编码?
    • Java中的日期与时间获取与转换?
    • 反射主要实现类有哪些?
    • Class类的作用是什么?如何获取Class对象?
    • 面向对象设计原则有哪些?
    • 反射的使用场景、作用及优缺点?
    • 下面代码的输出是?
    • 关于String[] strArr=new String[10];正确的是()
    • 写一个方法实现String类的replaceAll方法
    • String类是否可以继承?
    • String、StringBuilder、StringBuffer的区别?
    • 为什么String类被设计用final修饰?
    • String s = new String("xyz");创建几个String对象?
    • String s="a"+"b"+"c"+"d";创建了几个对象?
    • 对比一下Java和JavaSciprt
    • 什么是assert?
  • 集合
    • java 有哪些常用容器(集合)?
    • ArrayList和Vector的联系和区别
    • Collection和Collections有什么区别?
    • List、Set、Map 之间的区别是什么?
    • HashMap和Hashtable 有什么区别?
    • 如何决定使用HashMap还是TreeMap?
    • ArrayList和LinkedList的区别是什么?
    • Array和ArrayList有何区别?
    • 如何实现数组和List之间的转换?
    • Queue的add()和offer()方法有什么区别?
    • Queue的remove()和poll()方法有什么区别?
    • Queue的element()和peek()方法有什么区别?
    • 哪些集合类是线程安全的?
    • 迭代器Iterator是什么?
    • Iterator怎么使用?有什么特点?
    • Iterator和 ListIterator有什么区别?
    • 怎么确保一个集合不能被修改?
    • 为什么基本类型不能做为HashMap的键值?
    • HashMap的键值需要注意什么?
    • Java中已经数组类型,为什么还要提供集合?
    • TreeSet的原理是什么?使用需要注意什么?
    • HashSet实现原理是什么?有什么特点?
    • 正确的是()
    • HashSet和HashMap有什么区别?
    • ArrayList list=new ArrayList(10);中的list扩容几次?
    • List、Set、Map哪个继承自Collection接口?
    • ArrayList与LinkedList哪个插入性能高?
    • LinkedHashMap、LinkedHashSet、LinkedList哪个最适合当作Stack使用?
    • Map的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性?
    • TreeMap和TreeSet在排序时如何比较元素?
    • Collections工具类中的sort方法如何比较元素?
    • List里如何剔除相同的对象?
    • Java.util.Map的常用实现类有哪些?
    • List、Set、Map 是否继承自 Collection 接口?
    • Vector、ArrayList、LinkedList 的存储性能和特性?
    • List、Map、Set 三个接口,存取元素时,各有什么特点?
  • 网络编程
    • java中IO流有哪些?
    • BIO、NIO、AIO有什么区别?
    • tcp和udp的区别?
    • tcp为什么要三次握手,两次不行吗?为什么?
    • tcp粘包是怎么产生的?
    • OSI的七层模型有哪些?
    • 面向字符的输入流是()
    • 如何读取文件a.txt中第10个字节?
    • 关于流的创建,错误的是()
    • JDK中什么类可以通过流写入数据到内存?
    • 如何将字符串写入文件?
    • 输入流和输出流的区别
    • 列举常用字节输入流和输出流
    • 节点流和处理流区别
    • 字节流和字符流区别与适用场景
    • 缓冲流的优缺点
    • Java实现文件夹复制
    • Java中的Socket是什么?
    • 基于TCP和UDP的Socket编程的主要步骤
  • 并发
    • 并行是什么意思?与并发的区别是什么?
    • 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
    • 什么是守护线程?
    • 如何创建、启动 Java 线程?
    • 什么是并发编程?
    • 为什么要用并发编程?
    • 并发编程的缺点?
    • 导致并发程序出问题的根本原因是什么?
    • Java 程序中怎么保证多线程的运行安全?
    • 如何优雅地停止一个线程?
    • 线程包括哪些状态?状态之间是如何变化的?
    • 什么是线程池?
    • 线程池包含哪些状态?
    • Executors创建线程池有哪几种方式?
    • 如何停止一个线程池?
    • synchronized关键字的作用是什么?
    • volatile关键字的作用是什么?
    • Java中的锁是什么?
    • 锁如何使用?有什么注意事项?
    • 可重入锁与不可重入锁之间的区别与性能差异?
    • Java中的锁之间的区别是什么?
    • synchronized锁的升级原理是什么?
    • 什么是死锁?
    • 如何避免死锁?
    • 什么是活锁和饥饿?
    • Java中有哪些无锁技术来解决并发问题?如何使用?
    • 什么是 Java 内存模型?
    • 什么是 happens-before 原则?
    • sleep()和wait()有什么区别?
    • Runnable和Callable有什么区别?
    • notify()和notifyAll()有什么区别?
    • 线程池中submit()和execute()方法有什么区别?
    • ThreadLocal有什么作用?有哪些使用场景?
    • synchronized和volatile的区别是什么?
    • synchronized和Lock有什么区别?
    • synchronized和ReentrantLock区别是什么?
    • ReadWriteLock如何使用?
    • JDK中Atomic开头的原子类实现原子性的原理是什么?
    • 介绍一下ForkJoinPool的使用
    • LongAdder与AtomicLong有什么区别?
    • 乐观锁与悲观锁是什么?
    • 使用对象的wait()方法需要注意什么?
    • 哪种方式不会使线程进入阻塞状态()
    • volatile关键字能否保证线程安全?
    • 如何保证多个线程同时启动?
    • 同步和异步有何异同,分别在什么情况下使用?
    • 创建进程需要()
    • sleep()和yield()有什么区别?
    • 说说与线程相关的方法
    • 线程的run()方法和start()方法有什么区别?
    • 说说对于sychronized同步锁的理解
    • Java中实现线程通信方式有哪些?
    • JavaScript中null、undefined有什么区别?
  • WEB
    • jsp和servlet有什么区别?
    • jsp有哪些内置对象?作用分别是什么?
    • jsp的4种作用域?
    • session和cookie有什么区别?
    • session的工作原理?
    • 客户端禁止cookie,session还能用吗?
    • http响应码301和302代表的是什么?有什么区别?
    • forward和redirect的区别?
    • get和post请求有哪些区别?
    • 如何实现跨域?
    • 什么是JSONP?
    • HTML、CSS、Javascript在Web开发中的作用?
    • body中的onload事件和document.ready()有什么区别?
    • 写一些常见的Javascript正则表达式?
    • Javascript正则表达式使用方式有哪些?
    • jQuery中有哪些选择器?
    • div居中和内容居中的css属性设置
    • Servlet中的doPost和doGet方法有什么区别?传递和获取参数上有什么区别?
    • jQuery中get与eq方法的区别
    • 如何配置一个servlet?
    • JavaScript如何定义含有数值1至3的数组?
    • 常见的HTTP协议状态码?
  • 安全
    • 如何避免sql注入?
    • 什么是XSS攻击,如何避免?
    • 什么是CSRF攻击,如何避免?
  • 设计模式
    • 常用的设计模式有哪些?
    • 简单工厂和抽象工厂有什么区别?
    • 为什么Java中一个类可以实现多个接口,但只能继承一个类?
    • 什么是UML?
  • 框架
    • 为什么要使用spring框架?
    • 什么是aop?
    • 什么是ioc?
    • spring有哪些主要模块?
    • spring常用的注入方式有哪些?
    • spring中的bean是线程安全的吗?
    • spring支持几种bean的作用域?
    • spring自动装配bean有哪些方式?
    • spring事务实现方式有哪些?
    • 介绍一下spring mvc
    • spring mvc运行流程?
    • spring mvc有哪些组件?
    • @RequestMapping的作用是什么?
    • @Autowired的作用是什么?
    • 什么是spring boot?为什么要用?
    • spring boot核心配置文件是什么?
    • spring boot有哪些方式可以实现热部署?
  • 数据结构与算法
    • 递归计算n!
    • 什么是递归?递归的优缺点是什么?
    • 什么是复杂度?为什么要进行复杂度分析?
    • 什么是时间复杂度?什么是空间复杂度?
    • 如何进行复杂度分析?
    • 使用递归输出某个目录下所有子目录和文件
    • 常见加密算法有哪些?是否对称?
    • 合并两个有序的链表
    • 单向链表的反转
    • 一个不包含相同元素的整数集合,返回所有可能的不重复子集集合
    • 正确的是()
    • 统计某字符串在文件中出现的次数
    • 统计一段长字符串中某字符串的出现次数
  • 异常
    • 列举一些列举常见的运行时异常
    • OutOfMemoryError的原因有哪些?怎么解决?
    • Unsupported major.minor version 52是什么造成的,如何解决?
    • Java中如何进行异常处理?throws、throw、try、catch、finally分别如何使用?
    • 运行时异常与受检异常有何异同?
    • 异常的设计原则有哪些?
  • 文件解析与生成
    • Java中有哪些解析XML的类库?有什么特点?
    • 解析xml的方式有哪些?如何选择?
    • XML 文档定义有几种形式?有何区别?
    • 解析XML文档有哪些种方式?
    • XML的使用场景有哪些?
  • linux
    • 什么是Linux?
    • linux如何添加新系统用户?
    • 什么是bash别名?
    • 什么是linux内核?包括哪些模块?
    • linux指令-ls
    • linux指令-cd
    • linux指令-pwd
    • linux指令-mkdir
    • linux指令-rm
    • linux指令-rmdir
    • linux指令-mv
    • linux指令-cp
    • linux指令-cat
    • linux指令-more
    • linux指令-less
    • linux指令-tail
    • linux指令-head
    • linux指令-which
    • linux指令-whereis
    • linux指令-locate
    • linux指令-find
    • linux指令-chmod
    • linux指令-tar
    • linux指令-chown
    • linux指令-df
    • linux指令-du
    • linux指令-ln
    • linux指令-date
    • linux指令-cal
    • linux指令-grep
    • linux指令-wc
    • linux指令-ps
    • linux指令-top
    • linux指令-kill
    • linux指令-free
  • MySQL
    • 如何创建和删除数据库?
    • MyISAM与InnoDB的区别?
    • char与varchar的区别
    • 建表语句中varchar(50)中50的指是什么?
    • int(10)中10指什么?