开始补课线程,接下来会有一个系列来记录我的笔记
一、 线程(Thread)和进程(Process)
线程和进程是两个不同的概念,可以简单理解为多个线程(Thread)组成一个进程(Process)。进程之间相互隔离,而同一个进程中的线程则是资源共享的。
进程像是一个container,它中包含了一些线程。线程像是execution,它具体处理任务
线程是CPU调度的基本单位,进程则是资源分配的单位
二、 并发(Concurrency)和并行(Parallelism)
并发指的是一段时间内同时进行的任务,并行指的是严格意义上同时进行的任务。可以认为并发是逻辑上同时进行(先一后二,但间隔极短),并行是严格意义上同时进行(一二同时,没有间隔)。注意,由于Intel和超线程技术,我们并不能简单地认为几核CPU就最多可以处理几个线程。
例如对于一个8核16线程的CPU,他仅有8个物理核心(core)因此从物理上讲他只能同时处理8个并行的进程,但由于超线程技术(16线程),因此在逻辑上将可同时处理的线程增加到了16
个人认为并发数和并行数的比值可以作为衡量计算机利用cpu资源的能力的指标
三 java启动线程
用java启动线程有三种语法,分别是Runnable,Thread,Callable。其中Runnable和callable都是接口,Thread是一个类。最常用的方法是Runnable。Runnable和callable的区别是callable有返回值。
Runnable:新建一个类实现Runnable接口,并重写run方法。在另一个类中new一个Runnable对象,然后new一个Thread对象,参数为新建的Runnable对象。用new出来的Thread对象调用start方法来启动线程
Thread: 新建一个类继承Thread类,并重写run方法。在另一个类中new一个Thread对象并调用start方法
callable: 和Runnable一样
之所以更常用Runnable是因为他是接口,更灵活(一个类可以有多个接口,但只能继承一个类)
补充一下java中线程的六中状态
1 new状态,新建一个线程但并未启动
2 runnable状态,指这个线程处于运行或即将运行的状态
3 block状态(阻塞),线程正在等待进入一个同步块
4 wait状态(等待), 等待状态的线程一定需要另外一个线程来显式地唤醒(block状态的线程不需要其他线程来唤醒)
5 timewait状态,需要被另外一个线程唤醒或是停止足够长的时间(time.sleep()就是让线程进入timewait状态)
6 terminate状态(停止),一切线程最终都要被转入这个状态(运行结束或未捕获异常)
在写程序的时候,要时刻注意哪些线程被启动了