美文网首页
Java 线程方法 run() 分析

Java 线程方法 run() 分析

作者: Tinyspot | 来源:发表于2022-09-03 21:46 被阅读0次

1. 线程分析

方式一:实现 Runnable 接口,最终会调用 target.run()

public class Thread implements Runnable {
  private Runnable target;

  public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

  // name 设置线程名称
  public Thread(String name) {
      init(null, null, name, 0);
  }

  public Thread(Runnable target, String name) {
      init(null, target, name, 0);
  }

  private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize, AccessControlContext acc, boolean inheritThreadLocals) {
      this.target = target;
  }
  public void run() {
      if (target != null) {
          target.run();
      }
    }
}

方式二:继承 Thread 类
重写 run() ,执行的是重写后的逻辑

2. 匿名内部类方式创建线程

public static void main(String[] args) {
    new Thread() {
        @Override
        public void run() {
            System.out.println(this.getName());
        }
    }.start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }).start();
}

2.1 同时使用 Runnable 和 Thread 两种方式实现线程

先内部类, runnable 是作为一个参数

public static void main(String[] args) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Runnable...");
        }
    }) {
        @Override
        public void run() {
            System.out.println("Thread run");
        }
    }.start();
}

运行结果:Thread run

执行结果分析:
new Runnable() 只是作为 Thread(Runnable target) {} 构造方法的一个参数,当内部类覆盖 run() 方法后,run() 方法执行的就是内部类重写后的逻辑,不再执行原 Thread 里的 if (target != null) { target.run();}

3. start() vs run()

3.1 start()

  • 启动新线程
  • 准备工作
  • 不能重复调用 start()
    Thread thread = new Thread();
    thread.start();
    thread.start();

重复调用 start() 会抛异常 java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)

源码解析
1.启动新线程
2.加入线程组
3.调用 start0()

public synchronized void start() {
  // A zero status value corresponds to state "NEW".
  if (threadStatus != 0)
     throw new IllegalThreadStateException();

  group.add(this);
  boolean started = false;
  try {
      start0();
      started = true;
  }
}

3.2 run()

public void run() {
    if (target != null) {
        target.run();
    }
}

4. 示例

public static void main(String[] args) {
    new Thread(() -> {
        while (true) {
            log.info("running");
        }
    }, "t1").start();

    new Thread(() -> {
        while (true) {
            log.info("running");
        }
    }, "t2").start();
}

相关文章

  • Java 线程方法 run() 分析

    1. 线程分析 方式一:实现 Runnable 接口,最终会调用 target.run() 方式二:继承 Thre...

  • Java学习总结——多线程编程

    Java多线程编程 一、创建线程的方法一: 继承:extends Thread 重写run()方法 举个栗子?: ...

  • 线程基础

    ** java中创建线程的方法** 继承自java.lang.thread类,并重写run方法(线程运行时要做的事...

  • 20170716-0717 Java线程

    参考文献:《Java疯狂讲义》(第三版) run()方法:方法体即线程执行体 线程Target 执行体:run或c...

  • java实现多线程

    一.java创建线程的方法1.Thread类派生①.继承Thread类②.重写run()方法、该方法用来描述该线程...

  • Java 多线程知识点

    Java多线程并发 一、 java多线程创建方式 继承Tread类将自己的类继承Tread类,并重写run()方法...

  • Java多线程-实例解析

    Java多线程实例 3种实现方法 Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Th...

  • java多线程

    java多线程 [TOC] 创建线程 直接调用Thread类或Runnable类的run方法并不会 创建线程,只会...

  • Java多线程与常遇面试题总结

    Java多线程面试问题总结 1、多线程有什么用? 2、创建线程的方式 3、start()方法和run()方法的区别...

  • java多线程实现四中方式

    Java多线程实现的方式有四种1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,...

网友评论

      本文标题:Java 线程方法 run() 分析

      本文链接:https://www.haomeiwen.com/subject/dofjnrtx.html