线程状态
Java线程状态
New 尚未启动的线程 处于此状态
Runable 在java虚拟机中执行的线程 处于此状态
Blocked 被阻塞等待监视器锁定的线程 处于此状态
Waited 正在等待另一个线程执行特定动作的线程 处于此状态
Timed_waiting 正在等待另一个线程执行动作到达指定等待时间的线程 处于此状态
Terminated 已退出的线程 处于此状态
线程停止方法最好不要用stop() ,destroy():
/**
*
* 1. 建议线程正常停止 --> 不建议死循环
* 2. 建议使用标志位 --> 设置一个flag变量
* 3. 不要使用stop或destroy等过时方法
*/
public class StopThread 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 static void main(String[] args) {
StopThread stopThread = new StopThread();
new Thread(stopThread).start();
for(int i = 0; i < 100; i++){
System.out.println("main"+i);
if(i == 90){
// 调用stop方法切换标志位让线程停止
stopThread.stop(); // 这里只是停止了子线程
System.out.println("Thread has stopped");
}
}
}
}
线程休眠
(1) sleep(tine) 指定当前线程阻塞的毫秒数;
(2) sleep存在异常InterruptedException;
(3) sleep时间到达后,线程进入就绪状态;
(4) 每个对象都有一个锁,sleep不会释放锁
public class SleepThread 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();
}
// Thread.currentThread().getName 获得当前执行线程的名字
System.out.println(Thread.currentThread().getName()+"-->拿到了"+ ticketNums--+"票");
}
}
public static void main(String[] args){
SleepThread ticket = new SleepThread();
new Thread(ticket,"xiaoming").start();
new Thread(ticket,"teacher").start();
new Thread(ticket,"huangniu").start();
}
}
线程礼让
(1)让当前正在执行的线程暂停,但不阻塞;
(2)将线程从运行状态转为就绪状态;
(3)让cpu重新调度,,礼让不一定成功;
// 测试礼让线程, 不一定成功
public class YieldThread {
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()+"线程停止执行");
}
}