线程状态
- 创建状态:线程对象一旦创建就进入创建状态
- 就绪状态:当调用start()方法,线程立即进入就绪状态,但不意味着立即调度执行
- 阻塞状态:当调用sleep,wait或同步锁定时,线程进入阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态,等待CPU调度执行
- 运行状态:进入运行状态时,线程才真正执行线程体的代码块
- 死亡状态:线程中断或者结束,一旦进入死亡状态,就不能再次启动
线程方法
方法 | 说明 |
---|
setPriority(int newPriority) | 设定线程的优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 线程插队,强行排到当前执行的线程前面执行 |
static void yield() | 让当前正在执行的线程回来重新竞争,CPU重新选一个线程执行 |
void interrupt() | 中断线程,一般不用这个方式 |
boolean isAlive | 测试线程是否处于活动状态 |
线程停止
- 不推荐使用JDK提供的stop()、destroy()方法。(基本已经废弃)
- 推荐让线程自己停下来
- 建议使用一个标志位进行终止变量 当flag=false,则终止线程运行
示例代码如下
package com.thread;
public class TestStop implements Runnable{
private boolean flag=true;
@Override
public void run() {
int i=0;
while(flag){
System.out.println("run----thread"+i++);
}
}
public void stop(){
this.flag=false;
}
public void start(){
this.flag=true;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for(int i = 0;i<15000;i++){
System.out.println("main"+i);
if(i==5000){
testStop.stop();
System.out.println("线程该停止了");
testStop.start();
System.out.println("线程开始了");
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
发现问题
- 在同一个if语句后重新改变标志位可以继续运行,但在这个if语句之后再改变则无效
- 多线程如何debug