
创建状态
线程对象创建就进入了创建状态
就绪状态
调用start(),线程进入就绪状态,但还没有具体执行
运行状态
执行线程体的代码块时,线程处于运行状态
阻塞状态
当调用sleep()等方法时,线程进入阻塞状态,线程暂时不执行,等阻塞事件解除后再执行
死亡状态
线程结束进入死亡状态,进入死亡状态后的线程不能再启动
其转换关系如下图
Thread.State = NEW
已经创建但尚未启动的线程处于此状态
Thread.State = RUNNABLE
正在Java虚拟机中执行的线程处于此状态
Thread.State = BLOCKED
被阻塞等待监视器锁定的线程处于此状态
Thread.State = WAITING
正在等待另一个线程执行特定动作的线程处于此状态
Thread.State = TIMED_WAITING
正在等待另一个线程执行动作经过指定等待时间的线程处于此状态
Thread.State = TERMINATED
已经退出的线程处于此状态,已退出的线程不能再启动
建议让线程在循环结束时自己停止,不要用stop()和destroy()
线程休眠 sleep()sleep(时间) 指定当前线程阻塞的毫秒数sleep() 存在异常InterruptedException,需要抛出每个对象都有一个锁,sleep不会释放锁 线程礼让 yield()
线程礼让使已经在执行的线程暂停(但不阻塞),然后从运行状态转为就绪状态,让CPU重新调度
public class DemoYield {
public static void main(String[] args) {
Yield yield = new Yield();
new Thread(yield,"a").start();
new Thread(yield,"b").start();
}
}
class Yield implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield(); //礼让
System.out.println(Thread.currentThread().getName()+"线程停止");
}
}
这是因为线程礼让不一定让另一个线程先执行,因为礼让后两个线程同为就绪状态,先执行哪个要看CPU脸色
线程强制执行 join()可以暂停正在执行的线程,让另一个线程插队先执行完毕,然后原来的进程再继续执行
public class DemoJoin {
public static void main(String[] args) {
Common common = new Common();
new Thread(common).start();
}
}
class Common implements Runnable{
Vip vip = new Vip();
Thread thread = new Thread(vip);
@Override
public void run() {
for (int i = 0; i < 500; i++) {
if (i==200){
try {
thread.start();
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("普通线程执行—----"+i);
}
}
}
守护线程 daemon
线程分为用户线程和守护线程
用户线程就是普通的线程,需要手动让它停下来,虚拟机必须确保用户线程执行完毕
而虚拟机不用等待守护线程执行完毕,用户线程执行完了虚拟机就关闭,守护线程自然也停止了
public class DemoDaemon {
public static void main(String[] args) {
Person you = new Person();
God god = new God();
Thread godThread = new Thread(god);
godThread.setDaemon(true); //将上帝保佑设为守护线程
godThread.start();
Thread personThread = new Thread(you);
personThread.start();
}
}
class Person implements Runnable {
@Override
public void run() {
for (int i = 0; i < 30000; i++) {
System.out.println("开心地活了 "+i+" 天");
}
}
}
class God implements Runnable {
@Override
public void run() {
while (true){ //守护线程无限循环也没关系
System.out.println("上帝保佑着你");
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)