进程与线程
进程的概念: 进程是cpu分配资源的最小单位
线程的概念: 线程是cpu执行的最小单元
一个进程包含多个线程,但至少包括一个线程
java 中的线程调度算法使用的是 抢占式。
一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。
java中线程的两种创建方式:
继承Thread类,重写run()方法;实现Runnable接口,重写run()方法。
二者是有一些区别的:
- 使用继承,操作简单,直接操作线程,但有局限性,因为继承只有一次的机会;
- 使用接口实现,可以实现多实现的效果,可重用性高,耦合性低。
线程类的几个难以理解的方法:
void join(long millions)
表示当前调用该方法的线程加入执行队列,是剥夺式的。参数用来指定当前进程执行的毫秒数,如果不指定默认是把调用join()
的线程执行完毕。正在执行的线程是进入阻塞队列
static void yield()
表示把当前正在执行的线程调入到就绪队列,然后处理机从就绪队列重新选择相同优先级的线程来执行,有可能之前进程重新被调度,对外表现的就是该方法没有生效。
线程同步的实现方法:
实现线程同步的目的:防止共享数据的脏读。
synchronized 关键字
可是使用同步代码块,也可使用在方法中。对于同步代码块需要传入一个信号量,通常是当前对象(this):
synchronized(this){
//TODO CODE
}
synchronized关键字就相当于PV操作。