线程和进程
多线程
1.创建多线程
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(位于concurrent并发包中,重写Call()方法并交给FutureTask类来执行,Call()方法可以有返回值,可以抛异常,get()方法可以拿到返回值,该方法是阻塞的)
推荐实现接口方式,因为一是避免Java单继承,二是面向接口编程
2.线程常用方法
- 设置线程名
- 通过线程构造器设置
- 调用setName方法修改
- 设置守护线程
守护线程即服务线程,为其他线程服务,比如GC线程;当其他线程执行完,虚拟机退出时,守护线程也随之结束- 使用setDaemon(boolean on)来开启
- 注意的地方
- 先设置为守护线程再启动,否则报异常IllegalThreaStateException()
- 守护线程中产生的线程也是守护线程
- 使用守护线程不要访问共享资源,比如数据库、文件等,因为不知道它什么时候会结束
- 设置线程优先级
仅仅是增大线程获取cpu的几率,Java提供的优先级默认是5,最低是1,最高是10- 使用setPriority方法设置
- 中断进程
- 正常进程调用interrupt方法仅仅是设置了一个中断标志为true,线程继续执行不受影响
- 阻塞状态的线程调用interrupt方法,那么会抛出中断异常(用户捕捉到中断异常可以进行自定义操作),设置中断标志位为false,同时该线程会退出阻塞
- isInterrupted方法可以返回当前中断标志,用户可以用其监听中断状态
while(!Thread.currentThread.isInterrupted()){}
,当中断时执行中断处理代码 - interrupted方法返回当前中断标志,同时重置中断标志为false
- 阻塞方法
- 线程睡眠sleep方法和线程让步yeild方法
- 两者相似,sleep方法可以设置线程暂停时间,同时让出CPU,进入不可运行状态;让其他线程有机会执行,但是不释放锁,即其他线程不能访问共享数据
- yeild方法也是使线程暂停,同时让出CPU,但是它仍处于可运行状态;它是让相同优先级的线程有机会执行,如果检测没有同优先级的线程,它会继续执行原来的线程,它也不释放锁
- 线程同步join方法
- join方法是暂停当前线程的执行,而等待指定线程执行完毕或者执行一定时间
- 参数可选填时间,表示指定线程执行时间
- 必须在start之后使用才有意义
- join使线程的并发执行变成串行执行
- join使用了线程的wait方法来实现同步,如果A线程内调用B线程的join,就是A当线程调用了B线程的wait方法,A线程进入阻塞状态,直到B线程执行完
- 线程睡眠sleep方法和线程让步yeild方法