进程&线程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
进程是线程的容器
程序是指令、数据及其组织形式的描述
进程是程序的实体
面试回答:进程是资源分配的最小单位,线程是程序执行的最小单位
线程生命周期
New 刚刚创建的线程,还未开始执行,用start()调用可以开始
线程执行时处于Runnable状态
如果在执行过程中遇到了synchronize同步块,会进入Blocked阻塞状态
Waiting 进入一个无时间限制的等待
Timed_Waiting 进入一个有时限的等待,等待特殊事件完成
执行完毕后进入Terminated
新建线程
Thread t1 = new Thread();
t1.start();
start后,会新建一个线程,执行run()方法
start与run区别
start会新建一个线程,再执行run,run不会新建线程
可以直接通过继承Thread重写run方法,但是单继承比较浪费资源,所以通过继承Runnable接口最常用
默认的run方法本质也是继承Runnable接口
public class CreatThread implements Runnable{
public static void main(String[] args){
Thread t1 = new Thread(new CreatThread());
t1.start();
}
@Override
public void run(){
System.out.println("Yes");
}
}
终止线程
stop()直接终止,会导致数据不一致问题
stopMe()会选择合适时机停止
线程中断
public void Thread.interrupt() //中断线程
public boolean Thread.isInterrupted() //判断线程是否中断
public static boolean Thread.interrupted() //判断是否中断,并清除中断状态
只设置中断不会成功,必须接后序行为
wait & notify
在Object类中
当一个对象调用了wait时,当前线程会在这个对象上等待,直到这个对象调用了notify方法
线程调用了wait后,会进入object的队列中,然后等待notify随机唤醒一个线程
线程想调用wait或notify必须先获得对象的监视器(object监视器),然后才能调用wait或notify,调用完毕后释放监视器
suspend & resume
挂起 继续执行
不推荐使用suspend,因为suspend在导致线程停止的时候不会释放资源,导致其他关联的线程无法运行,如果resume意外的在suspend前执行,会导致系统无法正常工作
join & yield
结束 谦让
join 一个线程依赖其他线程的输出,此时这个线程就需要等待依赖线程执行完毕
yield 静态方法,使当前线程让出CPU
volatile 修饰,表示该数据是可能被修改的
守护线程Daemon
在后台默默完成一些系统性服务,例如垃圾回收,
用户线程
系统的工作线程,会完成这个程序应该要完成的业务操作
用户线程全部结束时代表这个程序结束了,守护线程要守护的对象不在了
当只有一个守护线程时,虚拟机会自然退出
设置守护线程需在线程start之前设置
线程优先级
Java中用1-10表示线程优先级,数字越大优先级越高
public final static int Min_Priority = 1;
public final static int Norm_Priority = 5;
public final static int Max_Priority = 10;
synchronized的作用是实现线程同步,对同步的代码加锁,使每一次只能有一个线程进入同步块,从而保证线程间的安全