线程状态
停止线程
在java中有三种方法可以停止线程,推荐线程自己停下来
- 使用退出标志,让线程正常退出,也就是当run方法执行完之后终止
- 使用stop方法强制终止线程,但是不推荐使用,因为stop和suspend及resume一样,是java废弃的方法
- 使用interrupt方法中断线程
示例代码:使用标志位使线程停止,main和Thread交替进行
public class TestStop implements Runnable {
private boolean flag = false;
public static void main(String[] args) {
TestStop stop = new TestStop();
new Thread(stop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main i:"+i);
if (i==300) {
stop.changeStop();
System.out.println("线程停止了...");
}
}
}
public void changeStop() {
this.flag = !this.flag;
}
@Override
public void run() {
int i = 0;
while (!flag) {
System.out.println("Thread run "+i+++"...");
}
}
}
sleep
sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。
作用:放大问题的发生性
示例代码:模拟倒计时
public static void main(String[] args) {
try {
daoJiShi();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 模拟倒计时
public static void daoJiShi() throws InterruptedException {
int num = 10;
while (num>-1) {
System.out.println(num--);
Thread.sleep(1000); // 1秒
}
}
yield
礼让进程,让 当前正在执行的进程暂停,但不阻塞。
将线程从运行状态转为就绪状态。
让cpu重新调度,礼让不一定成功!看cpu心情
实例代码:
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield, "A").start();
new Thread(myYield, "B").start();
}
}
class MyYield implements Runnable {
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+"开始执行...");
Thread.yield(); //礼让
System.out.println(name+"结束执行...");
}
}
运行截图:
礼让成功截图:
礼让失败截图:
join
join合并线程,待此线程执行完后,再执行其他线程。
实例代码:
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("VIP 来了 i:"+i+"...");
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin join = new TestJoin();
Thread thread = new Thread(join);
thread.start();
// 主线程
for (int i = 0; i < 200; i++) {
if (i==120)
thread.join(); // 插队
System.out.println("in main "+i+"...");
}
}
}