说到线程,通常要说到进程。微信
进程是指每一个独立程序在计算机上的一次执行活动,例如运行中的微信程序等。多线程
进程进一步能够细化为线程,线程是一个程序内部的一条执行路径。若是一个程序中能够在同一时间内执行多个线程,就说这个程序是支持多线程的。并发
从定义来讲,线程只是一个程序内部的一条执行路径,而进程是全部线程的集合。ide
从切换开销来讲,线程间的切换开销小,而进程间的切换开销大。spa
Java中的线程分为两类:一种是用户线程,另外一种是守护线程。任何线程均可以是“用户线程”或“守护线程”,它们几乎在每一个方面都是同样的,惟一的区别是判断虚拟机什么时候离开。线程
用户线程:Java虚拟机在它全部非守护线程都已经离开后自动离开。orm
守护线程:是用来服务用户线程的,若是没有其余用户线程在运行,那么就没有可服务的对象,也就没有理由继续下去。也被称为“后台线程”或“精灵线程”。对象
Java垃圾回收线程就是一个典型的守护线程,当程序中再也不有任何运行中的线程时,程序就不会再产生垃圾,垃圾回收器也就无事可作,因此当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开,结束程序的运行。继承
使用setDaemon(true)方法设置。接口
并发和并行是两个概念。
并行指同一时刻有多条指令在多个处理器上同时执行。
并发指同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具备多个进程同时执行的效果。
程序须要同时执行两个或多个任务时;
程序须要实现一些须要等待的任务时,例如用户输入等;
须要一些后台运行的程序时。
提升应用程序响应,加强用户体验。
提升计算机CPU的利用率,节省响应时间。
改善程序结构。
多线程有3大特性,分别为原子性、可见性、有序性。
原子性是指一个操做是不可中断的。
可见性是指当一个线程修改了某一个共享变量的值,其余线程是否可以当即知道这个修改。
有序性是指在并发时,程序的执行可能会出现乱序。给人的直观感受就是:写在前面的代码,会在后面执行。
推荐阅读:建立线程主要有3种方式:
经过继承Thread类来建立
经过实现Runnable接口来建立
经过实现Callable接口来建立
定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就表明了线程须要完成的任务。
建立Thread子类的实例,即建立了线程对象。
调用线程对象的start()方法来启动该线程。
定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体是该线程的线程执行体。
建立Runnable实现类的实例,并以此实例做为Thread的target来建立Thread对象,该Thread对象才是真正的线程对象。
调用线程对象的start()方法来启动该线程。
建立Callable接口的实现类,并实现call()方法,该call()方法将做为线程执行体,且该call()方法有返回值,再建立Callable实现类的实例。
使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法 的返回值。
使用FutureTask对象做为Thread对象的target建立并启动新线程。
调用FutureTask类对象的get()方法来得到子线程执行结束后的返回值。
通常推荐采用实现Runnable接口、Callcable接口的方式来建立多线程,由于相较于继承Thread类的方法,实现Runnable接口、Callcable接口的方式有以下优势:
线程类只是实现了Runnable接口或者Callcable接口,还能够继承其余类。
在这种方式下,多个线程能够共享同一个target对象,因此很是适合多个相同线程来处理同一份资源的状况,从而能够将CPU、代码和数据分开,造成清晰的模型,较好地体现了面向对象的思想。
启动线程使用start()方法,而不是run()方法;
调用start()方法来启动线程,系统会把该run()方法当成线程执行体来处理;
若是直接调用线程对象的run()方法,则run()方法当即就会被执行,并且在run()方法返回以前其余线程没法并行执行。