Java-----多线程【线程的方法、停止、状态观测和守护线程】

本文介绍了Java线程的五种关键操作:设置优先级、线程休眠、礼让、Join与线程停止,包括如何使用setPriority()、sleep()、yield()、join()和中断线程,以及避免使用已废弃的stop()方法。通过实例演示了如何控制线程生命周期和模拟网络延迟。
摘要由CSDN通过智能技术生成

线程状态

五大状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vo6PQXhW-1617798641942)(D:\学习\tupian\多线程\线程状态\zt.png)]

线程方法

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

停止线程

  • 不推荐使用JDK提供的stop()、destroy()方法。【已废弃】

  • 推荐线程自己停止下来

  • 建议使用一个标志位进行终止变量 当flag = false,则终止线程运行。

  • 代码实例:

    public class TextDemo1 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) {
            TextDemo1 t = new TextDemo1();
    
            new Thread(t).start();
    
            for (int i = 0; i < 500; i++) {
                System.out.println("main----"+i);
                // 调用stop方法切换标志位,让线程停止
                if (i==300){
                    t.stop();
                    System.out.println("线程该停止了");
                    break;
                }
            }
        }
    }
    
    
  • 线程休眠

    • sleep(时间)指定当前线程阻塞的毫秒数;

    • sleep存在异常InterruptedException;

    • sleep时间达到后线程进入就绪状态;

    • sleep可以模拟网络延时,倒计时等。

    • 每一个对象都有一个锁,sleep不会释放锁;

    • 代码实例:

      public class thread_xm{
      
      
          public static void main(String[] args) throws InterruptedException {
              run();
      
              tt();
          }
      
          // 模拟倒计时
          public static void run() throws InterruptedException{
              int a = 10;
              while (true){
                  Thread.sleep(1000);
                  System.out.println(a--);
                  if (a<=0){
                      break;
                  }
              }
          }
      
          public static void tt() throws InterruptedException {
              // 打印当前时间
              Date time = new Date(System.currentTimeMillis());// 获取当前系统时间
      
              while (true){
                  Thread.sleep(1000);
                  System.out.println(new SimpleDateFormat("HH:mm:ss").format(time));
                  time = new Date(System.currentTimeMillis());// 更新当前时间
              }
          }
      }
      

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7sOvyhlq-1617798641945)(D:\学习\tupian\多线程\线程状态\stop.png)]

  • 线程礼让

    • 礼让线程,让当前正在执行的线程暂停,但不阻塞

    • 将线程从运行状态转为就绪状态

    • 让CPU重新调度,礼让不一定成功!看CPU心情 不过礼让成功率还是很大的

    • 代码实例:

      public class TextYield {
          public static void main(String[] args) {
              myYield m = new myYield();
              new Thread(m,"a").start();
              new Thread(m,"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

    • Join合并线程,带此线程执行完成后,再执行其他线程,其他线程阻塞

    • 可以想象成插队
      D:\学习\tupian\多线程\线程状态\js.jpg

    • 代码实例:

      public class CaDuiText implements Runnable{
          public static void main(String[] args) throws InterruptedException {
      
              CaDuiText c = new CaDuiText();
              Thread t = new Thread(c);
              t.start();
      
              // 主线程
              for (int i = 0; i < 200; i++) {
                  if (i==100){
                      t.join();
                  }
                  System.out.println("普通用户"+i);
              }
      
          }
      
      
          @Override
          public void run() {
              for (int i = 0; i < 1000; i++) {
                  System.out.println("我是VIP,我有特权,不服憋着!!!");
              }
          }
      }
      

线程状态观测

  • Thread.State

    线程状态。线程可以处于一下状态之一:

    • NEW

      尚未启动的线程处于此状态。

    • RUNNABLE

      在Java虚拟机中执行的线程处于此状态。

    • BLOCKED

      被阻塞等待监视器锁定的线程处于此状态

    • WAITING

      正在等待另一个线程执行特定动作的线程处于此状态。

    • TIMED_WAITING

      正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。

    • TERMINATED

      已退出的线程处于此状态。

    一个线程可以在给定时间点处于一个状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。

    • 代码案例:

      public class TextDemo {
          public static void main(String[] args) throws InterruptedException {
              Thread thread = new Thread(()->{
                  for (int i = 0; i < 10; i++) {
                      try {
                          Thread.sleep(100);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                  System.out.println("///");
              });
      
              // 观察状态
              Thread.State state = thread.getState();
              System.out.println(state);
      
              // 观察启动后
              thread.start();
              state = thread.getState();
              System.out.println(state);
      
              // 只要线程不终止,就一直处于输出状态
              while (state != Thread.State.TERMINATED){
                  Thread.sleep(100);
                  state = thread.getState();
                  System.out.println(state);
              }
          }
      }
      
  • 线程优先级

    • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。

    • 线程的优先级用数字表示,范围从1~10

      1. Thread.MIN_PRIORITY = 1;
      2. Thread.MAX_PRIORITY = 10;
      3. Thread.NORM_PRIORITY = 5;

      优先级低只是以为着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度

    • 使用一下方式改变或获取优先级

      1. getPriority().setPriority(int xxx)

      优先级的设定建议在start()调度前

  • 守护(daemon)线程

    • 线程分为用户线程守护线程

    • 虚拟机必须确保用户线程执行完毕

    • 虚拟机不用等待守护线程执行完毕

    • 如,后台记录操作日志,监控内存,垃圾回收等待……

    • 代码实例:

      public class TextDemo {
          public static void main(String[] args) {
              God god = new God();
              You you = new You();
      
              Thread g = new Thread(god);
              g.setDaemon(true); // 默认是false表示的是用户线程,正常的线程都是用户线程
              g.start();
      
              new Thread(you).start();
      
          }
      }
      
      class God implements Runnable{
      
          @Override
          public void run() {
              while (true){
                  System.out.println("上帝守护着你");
              }
          }
      }
      
      class You implements Runnable{
      
          @Override
          public void run() {
              for (int i = 0; i <= 36500; i++) {
                  System.out.println("我开心的活在这个世界上");
                  if (i==36500){
                      System.out.println("======goodbye! world!=====");
                  }
              }
          }
      }
      

      这里一般来说上帝会一直执行,但是加上了守护方法,导致普通线程走完,守护线程也就一块停止了。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值