进程:运行起来的程序。进程需要占用系统资源(内存,CPU)。进程是最小的系统资源分配单位,只是给线程提供执行环境。 由于一个进程产生一个进程地址空间,且进程地址空间相互独立,一个进程死亡,其他进程不会受到影响。
线程:LWP(light weight process)轻量级进程。线程是最小的执行单位。CPU分配时间轮片的对象。
协程:coroutine,也叫轻量级线程。 与传统的系统级线程和进程相比,携程最大的优势在于“轻量级”,可以轻松创建上万个而不会导致系统资源衰歇。
并发:指统一时间内,宏观上处理多个任务
并行:指统一时间内,真正上处理多个任务
3.1 继承Thread类,重写run方法;
3.2 实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.3 通过Callable和FutureTask创建线程
3.4 通过线程池创建线程
在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。 不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。
不过,在java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果;
Callable和Runnable的区别:
1.Callable能接受一个泛型,然后在call方法中返回一个这个类型的值,而Runnable的run方法没有返回值;
2.Callable的call方法可以抛出异常,而Runnable的run方法不会抛出异常;
Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑
Futrure模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。
V get():获取异步执行的结果,如果没有结果可用,此方法会阻塞知道异步计算完成;
V get(Long timeout,TimeUnit unit):获取异步执行结果,如果没哟结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常;
boolean isDone():如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true;
boolean isCanceller():如果任务完成前被取消,则返回true;
boolean cancel(boolean mayInterrupRunning):如果任务还没有开始,执行cancel方法将返回false;如果任务已经启动,执行cancel方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;
当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;
当任务已经启动,执行cancel方法将返回false,MayInterruptRunning参数表示是否中断执行中的线程;
实际上Future提供了三种功能:
1.能够中断执行中的任务;
2.判断任务是否执行完成;
3.获取任务执行完成后的结果;
newCachedThreadPool:可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用;如果没有,就创建一个新的线程加入池中,缓存型池通常用于执行一些生存期很短的异步型任务;
newFixedThreadPool:创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程;
newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行
newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行;
6.1 初始状态(New):
线程对象创建出来后,没有调用start方法,线程处于初始状态;
6.2 运行状态:
1.就绪状态(Ready):调用了Start方法,等待CPU分配资源;
2.运行状态(RUNNING):CPU分配资源给该线程,该线程处于运行状态;
6.3 阻塞状态 (BLOCKED):
线程获取资源,如果资源获取成功则正常运行,如果资源获取失败,就处于阻塞状态,等待什么时候获取到资源再变为运行状态;
6.4 等待状态 (WAITING):
线程手动调用了wait()方法,或者join()方法,这些方法都是主动进入等待状态,等待状态会将CPU资源让渡,需要其他线程手动唤醒,notify(),notifyAll()唤起所有的等待线程;
6.5 超时等待状态 (TIMED_WAITING):
与等待状态相同,都是主动进入等待,也是需要其他线程唤醒,但是区别在与超时等待,如果超过了等待时间,则自动唤醒;
6.6 终止状态(DIED):
线程结束之后的状态;
7.1 start()方法
用于启动一个线程,使相应的线程进入排队等待状态。一旦轮到它使用CPU的资源的时候,它就可以脱离它的主线程而独立开始自己的生命周期了。注意即使相应的线程调用了start方法,但相关的线程也不一定会立刻执行,调用start方法的主要目的是使当前线程进入排队等待。不一定就立刻得到cpu的使用权限...
7.2 run()方法
Thread类和Runnable接口中的run方法的作用相同,都是系统自动调用而用户不得调用的。
7.3 sleep()方法
是Java中Thread类中的方法,会使当前线程暂停执行让出cpu的使用权限。但是监控状态依然存在,即如果当前线程进入了同步锁的话,sleep方法并不会释放锁,即使当前线程让出了cpu的使用权限,但其它被同步锁挡在外面的线程也无法获得执行。待到sleep方法中指定的时间后,sleep方法将会继续获得cpu的使用权限而后继续执行之前sleep的线程。
7.4 wait()方法
是Object类的方法,wait方法指的是一个已经进入同步锁的线程内,让自己暂时让出同步锁,以便其它正在等待此同步锁的线程能够获得机会执行。,只有其它方法调用了notify或者notifyAll(需要注意的是调用notify或者notifyAll方法并不释放锁,只是告诉调用wait方法的其它 线程可以参与锁的竞争了..)方法后,才能够唤醒相关的线程。此外注意wait方法必须在同步关键字修饰的方法中才能调用。
7.5 notify()方法
唤醒在此对象监视器上等待的单个线程,使其进入“就绪状态”。
7.6 notifyAll()方法
唤醒在此对象监视器上等待的所有线程,使其进入“就绪状态”。

新建(new):新创建了一个线程对象。
可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
运行(