JAVA-基础语法-多线程-创建线程以及状态

举报
Photon 发表于 2020/12/14 12:39:10 2020/12/14
【摘要】 JAVA-基础语法-多线程-创建线程以及状态

创建线程

  1. 方法一

    public class Main{
       public static void main(){
           Thread t = new MyThread();
           t.start();
      }
    }

    class MyThread extends Thread{
       @Override
       public void run(){
           Systemt.out.println("xxx");
      }
    }


  2. 方法二

    public class Main{
       public static void main(){
           Thread t = new Thread(new MyRunnable());
           t.start();
      }
    }

    class MyRunnable implements Runnable{
       @Override
       public void run(){
           Systemt.out.println("xxx");
      }
    }
  3. 方法三

    JDK1.8后引入 lambda 表达

    public class Main{
    Thread t = new Thread(()->{
           Systemt.out.println("xxx");
      });
       t.start();
    }


线程状态

参考链接



  • New:新创建的线程,尚未执行;

  • Runnable:运行中的线程,正在执行run()方法的Java代码;

  • Blocked:运行中的线程,因为某些操作被阻塞而挂起;

  • Waiting:运行中的线程,因为某些操作在等待中;

  • Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;

  • Terminated:线程已终止,因为run()方法执行完毕。

         ┌─────────────┐
        │     New     │
        └─────────────┘
              │
              ▼
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
┌─────────────┐ ┌─────────────┐
││ Runnable   │ │   Blocked   ││
└─────────────┘ └─────────────┘
│┌─────────────┐ ┌─────────────┐│
│   Waiting   │ │Timed Waiting│
│└─────────────┘ └─────────────┘│
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
              │
              ▼
        ┌─────────────┐
        │ Terminated │
        └─────────────┘

当线程启动后,它可以在RunnableBlockedWaitingTimed Waiting这几个状态之间切换,直到最后变成Terminated状态,线程终止。

线程终止的原因有:

  • 线程正常终止:run()方法执行到return语句返回;

  • 线程意外终止:run()方法因为未捕获的异常导致线程终止;

  • 对某个线程的Thread实例调用stop()方法强制终止(强烈不推荐使用)。

关键字:join

public class Main {
   public static void main(String[] args) throws InterruptedException {
       Thread t = new Thread(() -> {
           System.out.println("hello");
      });
       System.out.println("start");
       t.start();
       t.join();
       System.out.println("end");
  }
}

main线程对线程对象t调用join()方法时,主线程将等待变量t表示的线程运行结束,即join就是指等待该线程结束,然后才继续往下执行自身线程。所以,上述代码打印顺序可以肯定是main线程先打印startt线程再打印hellomain线程最后再打印end

如果t线程已经结束,对实例t调用join()会立刻返回。此外,join(long)的重载方法也可以指定一个等待时间,超过等待时间后就不再继续等待。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。