重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

怎么在Java中使用start方法实现多线程

这篇文章将为大家详细讲解有关怎么在Java中使用start方法实现多线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

目前成都创新互联已为近1000家的企业提供了网站建设、域名、网页空间、成都网站托管、企业网站设计、大荔网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1、为什么启动线程不用run()方法而是使用start()方法

run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样

而start()是创建线程等一系列工作,然后自己调用run里面的任务内容。

验证代码:

/**
 * @data 2019/11/8 - 下午10:29
 * 描述:run()和start()
 */
public class StartAndRunMethod {
  public static void main(String[] args) {
    Runnable runnable = new Runnable() {
      @Override
      public void run() {
        System.out.println(Thread.currentThread().getName());
      }
    };
    runnable.run();

    new Thread(runnable).start();
  }
}

结果:

main

Thread-0

2、start()源码解读

启动新线程检查线程状态

public synchronized void start() {
    /**
     * This method is not invoked for the main method thread or "system"
     * group threads created/set up by the VM. Any new functionality added
     * to this method in the future may have to also be added to the VM.
     *
     * A zero status value corresponds to state "NEW".
     */
    if (threadStatus != 0)
      throw new IllegalThreadStateException();

关于threadStatus源码:

  /*
   * Java thread status for tools, default indicates thread 'not yet started'
   */
  private volatile int threadStatus;

通过代码可以看到就是threadStatus就是记录Thread的状态,初始线程默认为0.

加入线程组

 /* Notify the group that this thread is about to be started
     * so that it can be added to the group's list of threads
     * and the group's unstarted count can be decremented. */
    group.add(this);

调用start0()

boolean started = false;
    try {
      start0();
      started = true;
    } finally {
      try {
        if (!started) {
          group.threadStartFailed(this);
        }
      } catch (Throwable ignore) {
        /* do nothing. If start0 threw a Throwable then
         it will be passed up the call stack */
      }
    }
  }

start0()方法使用c++编写的方法,这些代码在gdk代码中,所以这里不再这里探究了。

3、start()方法不能使用多次

通过刚刚源码分析,就知道start方法刚开始就检查线程状态,当线程创建后或结束了,该状态就不同于初始化状态就会抛出IllegalThreadStateException异常。

测试代码:

start不可以使用多次

public class CantStartTwice {
  public static void main(String[] args) {
    Thread thread = new Thread();
    thread.start();
    thread.start();
  }
}

4、注意点:

start方法是被synchronized修饰的方法,可以保证线程安全。

由jvm创建的main方法线程和system组线程,并不会通过start来启动。

Java有哪些集合类

Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;3、Set集合:不可重复;4、Map映射:无序,键唯一,值不唯一。

关于怎么在Java中使用start方法实现多线程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


文章名称:怎么在Java中使用start方法实现多线程
本文链接:http://cqcxhl.cn/article/jccpdd.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP