zoukankan      html  css  js  c++  java
  • 一个线程两次或者多次调用start()方法会怎么样

    会抛出IllegalThreadStateException()


    示例代码如下:

    public class Main{
      public static void main(String[] args){
    
        Thread t1 = new Thread(()->{System.out.println("this is a thread");});
    
        t1.start();
        t1.start()
      }
    
    }

    之所以会抛出异常,是因为在start()函数里,一开始会检查线程状态,如果线程状态不为0,会抛出该异常。线程的状态初始值为0,当第一次进入start()方法后,会修改线程状态,使其不为0,第二次进入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();
    
            /* 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);
    
            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 */
                }
            }
        }
  • 相关阅读:
    Qt调用外部程序QProcess通信
    QT错误:collect2:ld returned 1 exit status
    ARM编译空间属性(转)
    深入C语言内存区域分配(进程的各个段)详解(转)
    Linux系统的组成和内核的组成
    C语言中,头文件和源文件的关系(转)
    Ubuntu安装samba服务器
    2018年应该做的事
    生活经历1
    学习笔记
  • 原文地址:https://www.cnblogs.com/Chsy/p/12708694.html
Copyright © 2011-2022 走看看