一篇文章掌握Java Thread的类及其常见方法

作者:/少司命 时间:2023-03-11 09:43:03 

一,Thread 的几个常见属性

Thread 类是 JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的 Thread 对象与之关联。

Java中创建线程

显示继承Thread,重写run方法来指定线程执行的代码

匿名内部类来继承Thread,重写run方法来指定线程执行的代码

显示实现Runnable接口,重写run方法

匿名内部类来继承Runnable接口,重写run方法

通过lambda表达式来描述执行的代码

属性获取方法
IDgetId()
名称getNmame()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

ID 是线程的唯一标识,不同线程不会重复

名称是各种调试工具用到 状态表示线程当前所处的一个情况,下面我们会进一步说明

优先级高的线程理论上来说更容易被调度到

关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。

是否存活,即简单的理解,为 run 方法是否运行结束了

线程的中断问题,下面我们进一步说明


public static void main(String[] args) throws InterruptedException {
       Thread t = new Thread("123"){
           @Override
           public void run() {
               for (int i = 0; i < 10; i++){
                   System.out.println(Thread.currentThread().getName());
                   try{
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               System.out.println("线程退出");
           }
       };

//这一组属性,线程创建完成后,属性就不变了
       System.out.println(t.getName());
       System.out.println(t.getPriority());
       System.out.println(t.isDaemon());
       System.out.println(t.getId());
       //这组属性会随着线程的运行而开始改变
       System.out.println(t.isAlive());
       System.out.println(t.isInterrupted());
       System.out.println(t.getState());

t.start();

while (t.isAlive()){
           System.out.println("123 正在运行");
           System.out.println(t.getState());
           System.out.println(t.isInterrupted());
           Thread.sleep(300);
       }
   }

一篇文章掌握Java Thread的类及其常见方法

一篇文章掌握Java Thread的类及其常见方法

二,线程调试

1,启动一个线程

之前我们已经看到了如何通过覆写 run 方法创建一个线程对象,但线程对象被创建出来并不意味着线程就开始运行了。

覆写 run 方法是提供给线程要做的事情的指令清单

线程对象可以认为是把 李四、王五叫过来了

而调用 start() 方法,就是喊一声:&rdquo;行动起来!&ldquo;,线程才真正独立去执行了。


static class MyThread extends Thread{
       @Override
       public void run() {
           System.out.println("我是一个线程");
       }
   }

public static void main(String[] args) {
       Thread t = new MyThread();
       t.start();
   }

2,中断一个线程

中断让一个程序结束,结束可能有两种情况

        1,已经把任务执行完了

        2,任务执行到一半,被强制结束


public static void main(String[] args) throws InterruptedException {
       Thread t = new Thread(){
           @Override
           public void run() {
              while (! isQuit){
                  System.out.println("正在转账");
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
               System.out.println("转账终止");
           }
       };
       t.start();
       Thread.sleep(500);
       System.out.println("有内鬼,终止交易");
       isQuit = true;

}

一篇文章掌握Java Thread的类及其常见方法


public static void main(String[] args) throws InterruptedException {
       Thread t = new Thread(){
           @Override
           public void run() {
               while (!Thread.interrupted()){
                   System.out.println("正在转账");
                   try {
                       Thread.sleep(5000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                       break;
                   }
               }
               System.out.println("转账终止");
           }
       };
       t.start();
       Thread.sleep(5000);
       System.out.println("有内鬼,终止交易");
       t.interrupt();
   }

一篇文章掌握Java Thread的类及其常见方法

thread 收到通知的方式有两种:

1. 如果线程因为调用 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通 知,清除中断标志

        当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法. 可以选择 忽略这个异常, 也可以跳出循环结束线程.

2.否则,只是内部的一个中断标志被设置,thread 可以通过

        Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志

        Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志

这种方式通知收到的更及时,即使线程正在 sleep 也可以马上收到。


public static void main(String[] args) {
       Thread t = new Thread(){
           @Override
           public void run() {
               for (int i = 0; i < 10; i++){
                   System.out.println(Thread.interrupted());
               }
           }
       };
       t.start();
       t.interrupt();
   }

一篇文章掌握Java Thread的类及其常见方法


public static void main(String[] args) {
       Thread t = new Thread(){
           @Override
           public void run() {
               for (int i = 0; i < 10; i++){
                   System.out.println(Thread.currentThread().isInterrupted());
               }
           }
       };
       t.start();
       t.interrupt();
   }

一篇文章掌握Java Thread的类及其常见方法

3,等待一个线程

t1与t2串行执行


public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){
           @Override
           public void run() {
               for (int i = 0; i < 10; i++){
                   System.out.println("我是线程1");
                   try {
                       Thread.sleep(50);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
       };

Thread t2 = new Thread(){
           @Override
           public void run() {
              for (int i = 0; i < 10; i++){
                  System.out.println("我是线程2");
                  try {
                      Thread.sleep(50);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
           }
       };

t1.start();
       t1.join();
       t2.start();
       t2.join();
       System.out.println("主线程执行完毕");
   }

一篇文章掌握Java Thread的类及其常见方法

t1与t2并发执行


public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(){
           @Override
           public void run() {
               for (int i = 0; i < 10; i++){
                   System.out.println("我是线程1");
                   try {
                       Thread.sleep(50);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
       };

Thread t2 = new Thread(){
           @Override
           public void run() {
              for (int i = 0; i < 10; i++){
                  System.out.println("我是线程2");
                  try {
                      Thread.sleep(50);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
           }
       };

t1.start();
       t2.start();
       t1.join();
       t2.join();
       System.out.println("主线程执行完毕");
   }

一篇文章掌握Java Thread的类及其常见方法

4,休眠线程


public static void main(String[] args) throws InterruptedException {
       System.out.println(System.currentTimeMillis());
       Thread.sleep(1000);
       System.out.println(System.currentTimeMillis());
   }

一篇文章掌握Java Thread的类及其常见方法

一篇文章掌握Java Thread的类及其常见方法

1,如果线程在正常运行计算判断逻辑,此时就是在就绪队列中排队,调度器就会从就绪队列中筛选出合适的PCB让他在CPU上运行

2,如果某个线程调用sleep就会让对应的线程的PCB进入阻塞队列,阻塞队列无法在PCB上运行

3,时间到了之后,就自动把这个PCB拿回到原来的就绪队列中

来源:https://blog.csdn.net/qq_50156012/article/details/123181717

标签:Java,Thread,方法
0
投稿

猜你喜欢

  • Java中用爬虫进行解析的实例方法

    2021-06-23 09:07:00
  • java中set接口使用方法详解

    2023-03-15 06:10:12
  • Java中URL传中文时乱码的解决方法

    2022-05-17 02:16:55
  • 详解SpringMVC如何进行数据回显

    2023-09-12 08:48:15
  • SpringBoot之导入静态资源详解

    2021-06-22 05:01:30
  • Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    2022-06-03 13:39:58
  • C#使用LINQ查询表达式的基本子句总结

    2022-08-05 05:09:41
  • Android滑动事件冲突详解(一)

    2022-07-22 18:20:22
  • Java基础教程之数组的定义与使用

    2022-04-24 10:24:12
  • ThreadLocal常用方法、使用场景及注意事项说明

    2023-07-22 10:26:41
  • Java Web开发过程中登陆模块的验证码的实现方式总结

    2022-01-29 19:33:16
  • Java 多线程并发ReentrantLock

    2022-02-23 11:53:23
  • C#如何防止程序多次运行的技巧

    2022-11-10 01:18:59
  • 利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    2021-10-27 10:19:43
  • Java查看和修改线程优先级操作详解

    2023-09-13 08:25:30
  • C#编程简单实现生成PDF文档的方法示例

    2023-09-26 05:36:32
  • Java TreeMap排序算法实例

    2023-02-25 10:26:20
  • 简述Java图像倾斜方法及实例 <font color=red>原创</font>

    2023-08-16 09:38:47
  • C#的回调机制浅析

    2022-04-06 19:10:32
  • Java实现布隆过滤器的方法步骤

    2023-02-15 20:31:47
  • asp之家 软件编程 m.aspxhome.com