1.Thread——设置线程名称、获取线程名称。
当分析线程运行情况时,如何区分不同的线程?通过线程名称来区分不同线程。如果不设置线程名称,系统会分配一个默认的线程名称。
api:
void setName(String):表示给当前线程设置一个名称;
String getName():表示获取当前线程的名称。
【案例】
image.png
项目结构:
image.png
MyThread.java
image.png
MyTest.java
image.png
描述了:一个main线程,发起了2个子线程。
2.线程的生命周期
是指线程从开启到结束的整个过程。
5种状态:
(1)新建:创建一个线程对象实例。new Thread();
(2)就绪:准备运行,已经获得资源,但没有获得执行权;start()之后,运行之前。如果操作资源有限制,会立即转入“运行”
(3)运行:获得了cpu的执行权,进行了运行状态,代码正在执行。当我们看到一条条日志输出到控制台时,就是一个运行态。
(4)阻塞:运行后被挂起,或者占有cpu资源太多,出让cpu使用权。运行过程中,有更高级别任务需要使用cpu,这时出让cpu执行权。例如:执行程序过程中,需要用户通过键盘输入某某信息,程序才能继续往下执行,当前程序的线程就是阻塞状态。
(5)死亡:代码执行完毕,线程结束。
api:
public static void sleep(long millis)
public final void join()让某线程切入到当前线程
public static void yield(),线程让渡
public final void setDaemon(boolean on)设置是否后台线程;
public final void stop()中断线程执行,被淘汰
public void interrupt()中断,推荐使用这个。
【案例】执行t.stop
image.png
【案例】删除t.stop
image.png
参考代码:
image.png
image.png
日志:
调用t.stop():
image.png
不调用t.stop():
image.png
【作业】
主线程中有一个循环,每次循环输出一条日志,表示当前线程名称+当前时间(System.currentTimeMillis())。共循环10次。当第5次循环时,线程沉睡5秒。
在主线程中一开始就创建一个子线程,子线程也是执行一个10次循环,每次输出一条日志,表示当前线程名称+当前时间(System.currentTimeMillis())。当第3次循环时,线程沉睡3秒。
要求:
(1)截图出主线程日志中第5次输出和第6次输出日志时间,在图上标出时间差;
(2)截图出子线程日志中第3次输出和第4次输出日志时间,在图上标出时间差;
网友评论