线程的5种状态
新生状态:Thread thread = new Thread();
就绪状态:当调用start()方法,线程立即进入就绪状态,但并不以为着立即调度执行
运行状态:进入运行状态,线程才真正执行线程体的代码块。
阻塞状态:当调用sleep(),wait或者同步锁时,线程进入阻塞状态,就是代码不往下执行
阻塞事件解除后,重新进入就绪状态,等待cpu调度执行。
死亡状态:(dead):线程中断或者结束,一旦进入死亡状态,就不能再次启动。
线程的常用方法
方法 | 说明 |
---|---|
setPriority(int newPriority); | 更改线程优先级 |
static void sleep(long millis); | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join(); | 等待该线程终止 |
static void yield(); | 暂停当前正在执行的线程对象,并执行其他线程 |
void intrrupt(); | 中断线程,别用这个方式 |
boolean isAlive(); | 测试线程是否处于活动状态 |
自定义标识位结束线程:案例
不推荐使用JDK提供的stop()和destroy(),推荐线程自己停下来,设置一个变量,例如flag = false,则终止线程。
//设置标识位让线程在指定次数停止
public class TestThreadStop implements Runnable {
private boolean flag = true;
@Override
public void run() {
int i = 0;
//这里执行循环
while (flag) {
System.out.println(Thread.currentThread().getName() + "运行了第" + i++ + "次");
}
}
public boolean stop() {
return this.flag = false;
}
public static void main(String[] args) {
//错误示例:原因,在调用sotp方法时就需要new,和现在这个对象不是同一对象了,将陷入死循环
//new Thread(new TestThreadWay(),"自定义线程").start();
TestThreadStop t = new TestThreadStop();
Thread thread = new Thread(t, "自定义线程");
thread.start();
//当main线程运行900次时结束掉自定义线程
for (int i = 0; i < 1000; i++) {
if (i == 900) {
System.out.println(Thread.currentThread().getName()+"线程结束了====================");
t.stop();
break;
}
System.out.println("main------=========" + i);
}
}
}
sleep实现计时器案例:
public class TestThreadSleep implements Runnable {
@Override
public void run() {
int time = 0;
while (true) {
try {
Thread.sleep(1000);
System.out.println(time++);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (time == 60) {
System.out.println("1分钟结束,计时停止");
break;
}
}
}
public static void main(String[] args) {
new Thread(new TestThreadSleep()).start();
}
}
join() 合并线程:举例线程插队
package com.softeem;标签:JavaDay07,复习,Thread,void,线程,println,new,public From: https://www.cnblogs.com/a-sun/p/17433956.html
//合并线程 join()
public class TestThreadSleep implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Vip来了" + i);
}
}
public static void main(String[] args) throws InterruptedException {
TestThreadSleep t = new TestThreadSleep();
Thread t1 = new Thread(t);
t1.start();
//join()方法实现线程插队,注意:执行较小任务时不适用,会存在争夺时间片问题提前插队
for (int i = 0; i < 500; i++) {
System.out.println("排队" + i);
if (i == 50) {
t1.join();
}
}
}
}