1、进程与线程
线程(Lightweight Process,LWP)被称为轻量级进程,看名字就可以知道与进程之间的关系。一个程序可以有多个任务,通常每个任务称为一个线程(thread)。线程与进程最本质的区别在于:进程有自己的独立变量,线程则是共享数据。
2、创建线程
public class MyrRun implements Runnable
{
public void run(){
Runnable r = new MyrRun();
Thread t = new Thread(r);
t.start();
}
}
3、线程状态:
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
1、NEW(新生):当刚创建一个进程,并未执行start的时候,改进程处于NEW状态。
2、RUNNABLE(可运行):当一个进程调用start方法,就进入了RUNNABLE状态。处于可运行状态进程不一定是正在运行的,是否运行取决于系统分配给他的运行时间。
3、BLOCKED(被阻塞):当一个线程去申请内部对象锁,但是这个锁被其他线程所占有,此时进入被阻塞状态。
4、WAITING(等待):当一个线程等待另一个线程通知调度器一个条件是时。
5、TIMED_WAITING(记时等待):有些方法会传递超时参数,调用它们使得线程进入计时等待。
6、TERMINATED(终止):一个是run方法结束,自然死亡。另一个是捕获异常导致线程终端。
API:
java.lang.Thread
thread.State getState():得到线程状态。
3、进程调度
有两种调度模型:分时调度模型和抢占式调度模型。
分时调度模型是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片这个也比较好理解。
java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。
因此,java想要明确进程运行状态就需要用到一下方法:
让处于运行状态的线程调用Thread.sleep()方法 (给予低级线程运行机会)
让处于运行状态的线程调用Thread.yield()方法 (给予同等优先级的线程运行机会)
让处于运行状态的线程调用另一个线程的join()方法(迫使进程处于阻塞状态)