这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
多线程启动和运行
线程启动是调用start()方法进行启动,实质就是请求jvm运行相应的线程,这个线程具体什么时候运行由线程调度器决定。
注:
- start()方法调用结束,并不一定子线程开始运行
- 新开启的线程会调用run()方法
- 如果是启动多个线程,start()调用的顺序不一定是子线程运行的顺序
- 多线程运行结果与代码调用顺序或执行调用顺序无关
常用的线程方法
1.currentThread()方法
- Thread.currentThread() 可以获得当前线程,返回当前的线程对象。
2.setName()/getName()
- thread.setName() 设置线程名称
- thread.getName() 获取线程名称
3.isAlive()
- thread.isAlive() 判断当前线程是否处于活动状态
4.sleep()
- Thread.sleep(millis) 让当前线程睡眠指定的毫秒数。1000 ms == 1 s
5.getId()
- thread.getId() 获得线程唯一标识(注:线程技术后,该编号可能被新创建的线程使用)
6.yield()
- Thread.yield() 放弃当前CPU资源。()
7.setPriority()
- thread.setPriority(num) 设置线程的优先级
- num的取值范围 : [1,10] 。超会范围会抛出异常
- 优先级越高的线程获得CPU资源越多(注:当优先级的程序过多,可能会出现线程饥饿现象)
8.interrupt()
- thread.interrupt() 线程中断
9.setDaemon()
- thread.setDaemon(true); 设置守护进程
线程的生命周期
thread.getState()方法获得线程的生命周期状态。
线程的状态是Thread.State枚举类类型定义的。
- NEW,新建状态,创建了线程对象,在调用start()启动之前的状态
- RUNNABLE,可运行状态,负荷状态包含:READY和RUNNING两个状态
- READY:线程可以被线程调度器进行调度
- RUNNING:线程正在执行,可通过Thread.yield()变为READY状态
- BLOCKED: 线程堵塞。线程发起I/O操作或者申请由其他线程占用的资源,线程会转换为BLOCKED阻塞状态。处于阻塞状态的线程不占用CPU资源,当阻塞I/O执行完成或者线程获得了申请的资源,线程可以转换为RUNNABLE状态
- WAITING:等待状态。线程执行了obj.wait(),thread.join()方法会让线程装换为WAITING等待状态,执行obj.notify()方法或加入的线程执行完毕,当前线程会转换为RUNNABLE状态
- TIMED_WAITRING状态,与WAITING状态类似,都是等待状态。区别在于处于该状态的线程不会无限的登台,如果线程没有在指定的时间范围内完成期望的操作,该线程会转换为RUNNABLE状态
- TERMINATED,终止状态,线程结束处于终止状态。