线程核心思想
(1)线程因创建而产生
(2)线程因调度而运行
(3)线程因撤销而消亡
线程所有状态
(1)新建状态(new)
(2)就绪状态(有执行资格,无执行权)
(3)运行状态(有执行资格,有执行权)
(4)阻塞状态(没有执行资格,无执行权)
(5)线程死亡(Dead)
线程顺序
(1)新建状态 ------ 执行start()方法 ------> 就绪状态
(2)就绪状态 ------ 抢到cpu执行权,被操作系统选中 ------>运行状态
运行状态 ------ cpu执行权被其他线程剥夺,时间片用完 ------> 就绪状态
(3)运行状态 ------ sleep()、wait()、I/O操作 ------> 阻塞状态
(4)阻塞状态 ------ 睡眠结束、notify唤醒、I/O阻塞解除 ------> 就绪状态
(5)线程死亡 ------ run()方法执行结束、run()方法抛出异常、stop()方法(不推荐) ------> 线程死亡
Thread常用方法
(1)start();
功能:通过start()使得线程处于就绪状态,在获得CPU时间片后通过run()开始执行
(2)yield();
功能:让当前线程从运行状态回到可运行状态(就绪状态)
目的:让相同优先级的线程之间能适当的进行轮转运行
问题:实际上并不能保证yield()达到让步目的,因为让步后可能还是被程序调动选中
注意:yield()可能会没有效果
(3)sleep();
功能:方法的作用是在指定毫秒数内让当前正在执行的线程休眠(暂停执行)
原理:运行状态 ---- sleep() ----> 阻塞状态 ---- 睡眠结束 ----> 就绪状态
注意:sleep()方法可能会产生睡眠时间过长的异常需要try-catch
(4)join();
功能:等待当前线程运行结束后再进行其他线程
原理:阻止调用此方法的线程进入等待状态,直到该线程运行结束
场景:在主线程中,让主线程等待其余线程运行结束后再运行
(5)wait(); 和 notify();
功能:必须结对使用,wait()之后只有匹配到notify才会继续
原理:运行状态 ---- wait() ----> 阻塞状态 ---- notify唤醒 ----> 就绪状态
(4)实例分析
实例[1]-----关于yield的使用
{T1线程 }
package com.experiment_2_Thread.three;
public class T1 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i < 10001; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
{Test1}
package com.experiment_2_Thread.three;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
T1 t=new T1();
Thread t1=new Thread(t,"测试1");
t1.start();
Thread t2=new Thread(t,"测试2");
t2.start();
t1.yield(); //t1线程让出cpu一次
}
}
实例[2]-----关于睡眠方法的使用
{T2线程}
package com.experiment_2_Thread.three;
public class T2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
//currentTimeMillis()将系统时间转换成毫秒值
Long s=System.currentTimeMillis();
System.out.println("开始了");
try {
//睡眠操作可能会出现长时间等待异常
//2000毫秒 == 2 秒
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("结束了");
System.out.println("用时毫秒"+(System.currentTimeMillis()-s));
}
}
{Test2}
package com.experiment_2_Thread.three;
public class Test2 {
public static void main(String[] args) {
T2 t2 = new T2();
Thread thread = new Thread(t2);
thread.start();
}
}
实例[3]-----关于join()方法的使用
{T3线程}
package com.experiment_2_Thread.three;
public class T3 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i < 100; i++) {
System.out.println(i);
}
}
}
{Test3}
package com.experiment_2_Thread.three;
public class Test3 {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
T3 t3=new T3();
Thread thread=new Thread(t3,"测试");
thread.start();
thread.join();//必须等到t3线程运行完才能进行主线程
System.out.println("main线程结束了");
}
}