线程的状态
方法 | 解析 |
---|---|
setPriority(int newPriority) | 更改线程优先级 |
static void sleep(long millis) | 让指定线程休眠指定的毫秒数 |
void join() | 等待线程结束 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程(不推荐使用) |
boolean isAlive() | 测试线程是否处于活动状态 |
让线程停止
package com.thread.demo;
/*
* Stop
* 1.建议让线程自己正常停止 --> 循环次数,不建议用死循环
* 2.建议使用标志位 --->设置一个标志位
* 3.不要使用stop或者destroy等过时的或者jdk不推荐使用的方法!!
* */
public class Demo9 implements Runnable {
private boolean flag = true; // 定义一个标志位
@Override
public void run() {
int i = 0;
while (flag) {
i++;
System.out.println("子线程正在运行---->" + i);
}
}
public void stop() { // 定义一个可以由外部控制让线程停止的方法
this.flag = false;
}
public static void main(String[] args) {
Demo9 demo9 = new Demo9();
new Thread(demo9).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main线程-->" + i);
if (i == 900) {
demo9.stop();
System.out.println("子线程该停止了!");
}
}
}
}
让线程休眠
- sleep(时间)指定线程阻塞的毫秒数
- sleep存在InterruptedException异常
- sleep时间达到后线程进入就绪状态
- sleep可以模拟网络延时,倒计时等
- 每个对象都有一把锁,sleep不会释放锁
-
模拟网络延时—放大问题的发生性
package com.thread.demo; public class Demo10 implements Runnable { /* 买火车票问题 * 多个线程操作同一个资源时,出现线程安全问题,发生数据紊乱 * */ private int ticketNums = 10; /* * 模拟网络延时,可以方法问题的发生性 * */ @Override public void run() { while (true) { if (ticketNums <= 0) { break; } try { Thread.sleep(200); // 模拟延时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票"); } } public static void main(String[] args) { Demo10 demo10 = new Demo10(); new Thread(demo10,"小明").start(); new Thread(demo10,"小军").start(); new Thread(demo10,"黄牛").start(); } }
-
模拟倒计时
package com.thread.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo11 implements Runnable {
/*
* 模拟倒计时
* */
private int num = 10;
@Override
public void run() {
try {
tenDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 模拟倒计时
public void tenDown() throws InterruptedException {
while (true){
Thread.sleep(1000);
if (num<=0)break;
System.out.println(num--);
}
}
public static void main(String[] args) throws InterruptedException {
// Demo11 demo11 = new Demo11();
// new Thread(demo11).start();
Date time = new Date(); //获取当前时间
while (true){//打印系统时间
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(time)); // 格式化输出
time = new Date(); // 更新时间
}
}
}
线程礼让
- 礼让线程,让当前正在执行的线程停止并进入就绪状态
- 让CPU重新进行调度,有可能CPU任然调度该线程,看CPU心情。
package com.thread.demo;
public class Demo12 {
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() {
System.out.println(Thread.currentThread().getName()+"线程正在执行");
Thread.yield(); //线程礼让
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}
join,等待线程停止(插队)
package com.thread.demo;
public class Demo13 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("我是VIP等我跑完你再跑-->" + i);
}
}
/*
* join方法 ,等待线程结束,理解为插队
* */
public static void main(String[] args) throws InterruptedException {
Demo13 demo13 = new Demo13();
Thread thread = new Thread(demo13);
thread.start();
for (int i = 0; i < 500; i++) {
System.out.println("普通用户-->" + i);
if (i == 200) thread.join(); //开始插队
}
}
}
线程状态。
线程可以处于以下状态之一:
NEW
尚未启动的线程处于此状态。RUNNABLE
在Java虚拟机中执行的线程处于此状态。BLOCKED
被阻塞等待监视器锁定的线程处于此状态。WAITING
正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。TERMINATED
已退出的线程处于此状态。
一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。
package com.thread.demo;
public class Demo14 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("-------------------------");
});
Thread.State state = thread.getState();
System.out.println(state); // NEW
thread.start(); // 激活线程
state = thread.getState(); // RUNNABLE
System.out.println(state);
// 观察线程状态
while (thread.getState()!=Thread.State.TERMINATED){
Thread.sleep(1000);
state = thread.getState(); // 更新线程状态
System.out.println(state);
}
}
}