Java多线程详解(2)线程状态

在这里插入图片描述

方法说明
setPriority(int newPriority)更改线程优先级
static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠
void join()等待该线程终止
static void yield()暂停当前正在执行的线程对象,并执行其他线程
void interrupt()中断线程,但现在官方已经不建议使用这个方法了
boolean isAlive()测试线程是否处于活动状态

1.线程停止

  • 官方已经不推荐使用jdk提供的stop()和destroy()方法了
  • 建议使用一个标志位进行终止变量,则当flag=false,子线程终止运行
public class TestStop extends Thread{

    private boolean flag = true;

    @Override
    public void run(){
            int j = 0;
            while (flag) {
                System.out.println("run方法执行");
                j++;
            }
    }

    public void stopThread(boolean flag){
        this.flag = flag;
    }

    public static void main(String[] args) {
        //创建一个线程对象
        TestStop testStop = new TestStop();

        //调用start()方法开启线程
        testStop.start();
		//主线程判断后 置flag为false
        for (int i=0;i<200;i++){
            System.out.println("主线程执行");
            if(i==199){
                testStop.stopThread(false);
                System.out.println("终止子线程");
            }
        }
    }

}

运行结果:


主线程执行
主线程执行
run方法执行
终止子线程

2.线程休眠

  • 要抛出InterruptedException异常
  • 每一个对象都有一把锁,sleep不会释放锁
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestSleep {
	//休眠主线程
    public static void main(String[] args) {
    
        Date startTime = new Date(System.currentTimeMillis());//获取当前时间
        while(true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//刷新时间
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

运行结果:


11:07:12
11:07:13
11:07:14
11:07:15

3.线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行态转为就绪态
  • 让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() {
        System.out.println(Thread.currentThread().getName()+"线程开始");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"线程结束");
    }
}

运行结果:

a线程开始
b线程开始
a线程结束
b线程结束(结果不一定)

4.线程强制执行

public class TestJoin implements Runnable{

    @Override
    public void run() {
        for(int i = 0;i<100;i++){
            System.out.println("拥有高级会员的线程"+i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();
        //主线程
        for(int i = 0;i<100;i++){

            if(i==20){
                //高级会员插队
                thread.join();
            }
            System.out.println("主线程" + i);
        }
    }
}

运行结果:


主线程18
拥有高级会员的线程18
主线程19
拥有高级会员的线程19(if判断为true后子线程强制插队)
拥有高级会员的线程20
拥有高级会员的线程21

5.观测线程状态

  • NEW (尚未启动的线程处于此状态)
  • RUNNABLE(在Java JVM中执行的线程处于此状态)
  • BLOCKED(被阻塞等待监视器锁定的线程处于此状态)
  • WAITING(正在等待另一个线程执行特定动作的线程处于此状态)
  • TIME_WAITING(正在等待另一个线程执行动作到达指定时间的线程处于此状态)
  • TERMINATED(已退出的线程处于此状态)
//线程对象名.getState()可以得到当前得状态

6.线程的优先级

  • Java提供一个线程调度器来监视程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪一个线程来执行
  • 线程的优先级用数字表示,范围从1~10
    Thread.MIN_PRIORITY = 1;
    Thread.MAX_PRIORITY = 10;
    Thread.NORM_PRIORITY = 5;
  • 使用getPriority()和setPriority(int i)改变和获取优先级
public class TestPriority {

    public static void main(String[] args) {
        MyPriority myPriority = new MyPriority();

        Thread t1 = new Thread(myPriority);
        Thread t2 = new Thread(myPriority);
        Thread t3 = new Thread(myPriority);
        Thread t4 = new Thread(myPriority);

        t1.setPriority(1);
        t1.start();

        t2.setPriority(6);
        t2.start();

        t3.setPriority(8);
        t3.start();
        
        t4.setPriority(Thread.MAX_PRIORITY);
        t4.start();
    }

}

class MyPriority implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-->>"+Thread.currentThread().getPriority());
    }
}

运行结果:

Thread-3–>>10
Thread-2–>>8
Thread-0–>>1
Thread-1–>>6(优先级高不一定先执行)

7.守护线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不必等待守护线程执行完毕
  • 比如 后台记录操作日志,监控内存,垃圾回收等待…
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值