一、线程的状态
1.新生状态
2.就绪状态
3.运行状态
4.就绪状态
5.死亡状态
二、停止线程
1.自然终止:线程体正常执行完毕
2.外部干涉
1)线程类中定义线程体使用标识
private boolean flag = true;
2)线程体中使用该标识
@Override
public void run() {
//线程体使用该标志
while(flag) {
System.out.println("study thread");
}
}
3)提供对外的方法来改变此标识
public void stop(){
this.flag = false;
}
4)外部方法根据条件调用此方法
s.stop();
三、阻塞
1.join:合并线程
2.yield:暂停自己的线程(静态的方法)
3.sleep:休眠,暂停当前线程,此时不会释放锁
1)与时间相关
package com.bjsxt.thread.status;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 倒计时
* 倒数1个数,一秒打印一个
* 倒计时
* @author Administrator
*
*/
public class SleepDemo01 {
public static void main(String[] args) throws InterruptedException {
Date endtime = new Date(System.currentTimeMillis()+10*1000);
long end = endtime.getTime();
while (true) {
//输出
System.out.println(new SimpleDateFormat("mm:ss").format(endtime));
//等待一秒
Thread.sleep(1000);
//10s内继续,否则跳出
endtime = new Date(endtime.getTime()-1000);
if (end-10000>endtime.getTime()) {
break;
}
}
}
public static void test01() throws InterruptedException{
int num = 10;
while(true) {
System.out.println(num--);
//暂停休眠睡眠
Thread.sleep(1000);
if (num<=0) {
break;
}
}
}
}
2)模拟网络延时
package com.bjsxt.thread.status;
/**
* sleep模拟网络延时
* 可能会导致程序不准确,《线程不安全》
* @author Administrator
*
*/
public class SleepDemo02 {
/**
*
* @param args
*/
public static void main(String[] args) {
Web12306 web = new Web12306();
//代理
Thread t1 = new Thread(web,"路人甲");
Thread t2 = new Thread(web,"黄牛已");
Thread t3 = new Thread(web,"工程甲");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
class Web12306 implements Runnable{
private int num = 50;
@Override
public void run() {
while(true) {
if (num<=0) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//同一份资源,引起的并发问题
System.out.println(Thread.currentThread().getName()+" 抢到了 "+num--);
}
}
}
https://blog.csdn.net/it_manman/article/details/79402064?utm_source=blogxgwz0