几乎任何操作系统都支持运行多个任务,通常一个任务就是一个程序,一个程序就是一个进程,当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个单位,当程序进入内存运行时,即为进程。
3、并发性:多个进程可以在单个处理器上并发执行,互不影响。
并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU操作层面上不是真正的同时并行:多个CPU实例或者多台机器同时执行一段处理逻辑,是真正的同时线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程,线程可以拥有自己的堆栈,自己的程序计数器和局部变量表,但不能拥有系统资源它与父进程的其他线程共享该进程的所有资源。
1、继承Thread类创建线程类
(1)、定义Thread类的子类,并重写该类的run方法,该方法的方法体就代表了线程要完成的任务,因此把run方法称为执行体(2)、创建Thread子类的实例,即创建了线程对象。(3)、调用线程对象的start()方法来启动线程。2、实现runnable接口创建线程类
(1)、定义runnable接口的实现类,并重写该接口的run()方法(2)、创建runnable实现类的实例,并以此实例作为Thread的目标来创建Thread对象,该Thread对象才是真正的线程对象(3)、调用线程对象的start()方法来启动线程3、实现callable接口方式创建线程类
(1)、创建callable接口的实现类,并实现call()方法,该方法将作为线程执行体,并且有返回值;(2)、创建callable实现类的实例,使用FutureTask对象封装Callable对象call()方法的返回值(3)、使用FutureTask对象作为Thread对象Target创建并启动新线程(4)、调用FutureTask对象的get()方法来获得线程执行结束后的返回值4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权, 暂时停止运行,直到线程进入就绪状态,才有机会转到运行状态
(1)、等待阻塞:运行的线程执行wait()方法时,JVM会把线程放入等待池中;(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程占用,则JVM会把该线程放入锁池中(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出I/O请求时,JVM会把该线程置为阻塞状态,当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完毕时,线程重新载入就绪状态。5、死亡状态(Dead):线程执行完了或者因异常退出run()方法,该线程结束生命周期
用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括表格、内存空间、磁盘空间、I/O设备等,然后把该进程放入进程的就绪队列,进程调度程序选中它,为它分配CPU和其他有关资源,该进程才真正运行。所以开启进程的开销较大
转载于:https://www.cnblogs.com/qizc/p/10760663.html