何为进程:
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。当一个程序被运行, 从磁盘加载这个程序的代码至内存, 这时就开启了一个 进程。进程就可以视为程序的一个实例。站在操作系统的角度, 进程是程序运行资源分配(以内存为主)的最小单位。
何为线程:
线程必须依赖于进程而存在,线程是进程中的一个实体,是
CPU
调度和分 派的基本单位,它是比
进程更小的、能独立运行的基本单位。线程自己基本上不 拥有系统资源
,
,只拥有在运行中必不可少的资源(
如程序计数器
,
一组寄存器和栈
),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 一个进程可 以拥有多个线程, 一个线程必须有一个父进程。线程, 有时也被称为轻量级进程 (
LWP
),早期
Linux
的线程实现几乎就是复用的进程,后来 才独立出自己的 API。
新启线程有几种方式?
官方说法是在 Java 中有两种方式创建一个线程用以执行, 一种是派生自 Thread 类,另一种是实现 Runnable 接口。
其实Java创建线程有很多种方式啊,像实现Runnable、Callable接口、继承Thread类、创建线程池等等,不过这些方式并没有真正创建出线程,严格来说,Java就只有一种方式可以创建线程,那就是通过new Thread().start()创建。
而所谓的Runnable、Callable……对象,这仅仅只是线程体,也就是提供给线程执行的任务,并不属于真正的Java线程,它们的执行,最终还是需要依赖于new Thread()……
深入理解
run()
和
start()?
Thread
类是
Java
里对线程概念的抽象,可以这样理解:我们通过
new Thread()
其实只是
new
出一 个 Thread
的实例,还没有操作系统中真正的线程挂起钩来。 只有执行了
start()
方法后,才实现了真 正意义上的启动线程。 从 Thread
的源码可以看到,
Thread
的
start
方法中调用了
start0()
方法,而
start0()
是个
nati ve
方 法, 这就说明 Thread#start
一定和操作系统是密切相关的。
start()
方法让一个线程进入就绪队列等待分配
cpu
,分到
cpu
后才调用实现 的
run()
方法,
start()
方
法不能重复调用,如果重复调用会抛出异常。而 run
方法是业务逻辑实现的地方, 本质上和任意一个类的任意一个成员方 法并没有任何区别, 可以重复执行,也可以被单独调用。