程序(program):一个固定的运行逻辑和数据的集合,是一个静态的状态,一般存储在硬盘中
进程(process):一个正在运行的程序,是一个程序的一次运行,是一个动态的概念,一般存储在内存中。有自己的地址空间。
“多任务”:指操作系统能同时运行多个进程(程序)。如window7系统可以同时运行写字板程序、画图程序
进程(process):一个正在执行的程序,有自己独立的资源分配,是一个独立的资源分配单位。——独占内存
线程(thread):是进程内部单一的一个顺序控制流,一条独立的执行路径。多线程,在执行某个程序的时候,该程序可以有多个子任务,每个线程都可以独立的完成其中一个任务。在各个子任务之间,没有什么依赖关系,可以单独执行。
、WORD 、EXCEL等。
并行(parallel):多个任务(进程、线程)同时运行。在某个确定的时刻,有多个任务在执行
条件:有多个cpu,多核编程
并发(concurrent):多个任务(进程、线程)同时发起。不能同时执行的(只有一个cpu),只能是同时要求执行。就只能在某个时间片内,将多个任务都有过执行。一个cpu在不同的任务之间,来回切换,只不过每个任务耗费的时间比较短,cpu的切换速度比较快,所以可以让用户感觉就像多个任务在同时执行。
主线程
在任何Java程序启动时,一个线程立刻运行(即main方法对应的线程),该线程通常称为程序的主线程。
主线程的特点:
它是产生其他子线程的线程。
它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。
新建态:刚创建好对象的时候,刚new出来的时候
就绪态:线程准备好了所有运行的资源,只差cpu来临
运行态:cpu正在执行的线程的状态
阻塞态:线程主动休息、或者缺少一些运行的资源,即使cpu来临,也无法运行
死亡态:线程运行完成、出现异常、调用方法结束
setDaemon(boolean on)
必须在启动线程之前(调用start方法之前)调用setDaemon(true)方法,才可以把该线程设置为后台线程。
Callable接口是对Runnable接口的增强,提供了一个call()方法,作为线程的执行体。但call()方法比run()方法功能更强大。
call()方法可以有返回值
call()方法可以抛出异常
使用FutureTask包装Callable对象,用来获得call方法的返回值。
现在我们所有学习的线程都要往 Thread 身上靠拢,要通过其start() 开启线程任务
Thread t = new Thread(Runnable 的实现类对象);
通过查看API 我们发现 其中有一个提供好的 实现类对象 FutureTask
查看API 我们发现FutureTask ft = new FutureTask(传递一个Callabel的实现类对象)
创建一个类 实现 Callable,重写里面的call() 方法
最终通过 t.start() 开启线程任务
第三种线程的实现方式
1, 创建Callanble的实现类对象,重写call()方法
2, 创建FutureTask对象的时候将 Callanble实现类对象进行传递
3, FutureTask是Runnable的实现类对象,所以创建Thread的时候可以把FutureTask
传递到Thread的构造方法中
4, 最终通过Thread中的 start()方法 开启线程任务