线程的正常的执行一般是四个执行状态:创建状态-->就绪状态-->运行状态-->死亡状态
创建状态:创建状态也就是当线程被创建的时候出现了创建状态如:Thread t=new Thread();
就绪状态:就绪状态也就是当线程启动的时候出现的状态如:t.start();
运行状态:当cpu调用线程时则线程就进入了运行状态.
死亡状态:当程序执行完时线程就会进入死亡状态.(线程进入死亡状态就不能再次启动了)
阻塞状态:当线程进入运行状态时,使用方法使线程进入休眠等就会进入堵塞状态等待休眠过后在进入就绪状态等待cpu调用.
线程的五大状态同时也对应着Thread类的六个枚举类型:
NEW 尚未启动的线程处于此状态RUNNABLE 在java虚拟机中执行的线程处于此状态 BLOCKED 被阻塞等待监视器锁定的线程处于此状态WAITING 正在等待另一个线程执行特定动作的线程处于此状态TIMED_WAITING 正在等待另一个线程执行动作到达指定等待时间的线程处于此状态TERMINATED 已退出的线程处于此状态
示例:
public class Test12 {
public static void main(String[] args) throws InterruptedException {
//创建线程
Thread a = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}, "测试线程");
//获取线程状态
Thread.State stat = a.getState();
System.out.println(stat); //NEW是新生状态
//启动线程
a.start();
//输出状态
for (int i = 0; i <= 2; i++) {
System.out.println(a.getState()); //先是RUNNABLE 运行状态 在是 TERMINATED死亡状态
Thread.sleep(1000);
}
}
}
线程停止
线程类Thread有一个线程停止a.stop();方法但是被JDK弃用了,当需要线程停止的时候可以设置一个中间变量如:
public class Test7 implements Runnable{
private static boolean flag=true;
public static void main(String[] args) {
Test7 test=new Test7();
new Thread(test).start();
for (int i = 0; i < 100; i++) {
System.out.println("main"+i);
if (i==99){
flag=false;
System.out.println("线程停止");
}
}
}
@Override
public void run() {
int i=0;
while(flag){
System.out.println("线程"+i++);
}
}
}
线程休眠
线程用sleep()方法可进入休眠,参数是毫秒,1秒==1000毫秒
sleep(时间)指定当前线程时间堵塞的毫秒数sleep存在的异常InterruptedExceptionsleep时间到达后线程进入就绪状态sleep可以模拟网络延迟,倒计时等每一个对象都有一把锁sleep不会释放锁
实例:
实现一个没一秒打印一次当前时间的程序
package Test;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test9 implements Runnable{
public static void main(String[] args) {
new Thread(new Test9()).start();
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
}
}
}
线程礼让
想要线程暂停回到就绪状态可使用yield()方法进行礼让线程
礼让线程让当前正在执行的cpu暂停,不堵塞礼让线程是不会堵塞的礼让线程是让cpu重新调用,不一定会成功,全看cpu心情!
实例:
public class Test10 implements Runnable {
public static void main(String[] args) {
Test10 test = new Test10();
new Thread(test, "a").start();
new Thread(test, "b").start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行");
Thread.yield();//礼让线程
System.out.println(Thread.currentThread().getName() + "执行");
}
}
线程方法


![java复习第十八天[多线程三] java复习第十八天[多线程三]](http://www.mshxw.com/aiimages/31/727707.png)
