首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程执行run()方法两次

线程执行run()方法两次是指在多线程编程中,一个线程对象的run()方法被连续调用两次。

在Java中,线程是通过实现Runnable接口或继承Thread类来创建的。当一个线程对象被创建后,可以通过调用start()方法来启动线程,并执行其run()方法中的代码。每个线程对象只能启动一次,即只能调用一次start()方法。

如果在一个线程对象已经启动并执行完run()方法后,再次调用start()方法,会抛出IllegalThreadStateException异常。这是因为线程对象的状态已经变为TERMINATED,无法再次启动。

以下是线程执行run()方法两次的示例代码:

代码语言:txt
复制
public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread is running.");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);

        thread.start(); // 第一次启动线程
        thread.start(); // 第二次启动线程,会抛出IllegalThreadStateException异常
    }
}

在上述示例中,当第二次调用thread.start()时,会抛出IllegalThreadStateException异常,因为线程对象已经启动并执行完run()方法。

线程执行run()方法两次的情况通常是由于代码逻辑错误导致的,应该避免在同一个线程对象上多次调用start()方法。如果需要多次执行线程的逻辑,可以考虑使用循环或其他控制结构来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入线程Thread类的start()方法run()方法

如果一个线程run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。...2、调用start()方法后,线程是不是马上执行?...特别是当线程已经结束执行后,不能再重新启动。 三、run( )方法 1、run方法又是一个什么样的方法run方法与start方法有什么关联?...方法执行是不是需要线程调用start()方法 上面说了,run()方法是一个普通的对象方法,因此,不需要线程调用start()后才可以调用的。...总结: 通过实例1和实例和我们可以知道start方法是用于启动线程的,可以实现并发,而run方法只是一个普通方法,是不能实现并发的,只是在并发执行的时候会调用。

2.9K00
  • Java并发编程:为什么我们调用 start()方法时会执行 run()方法

    在Java并发编程中,调用start()方法时会启动一个新的线程,并且该线程执行run()方法。...二、线程状态 在调用start()方法后,线程并不能立即开始执行run()方法,而是处于就绪状态(Runnable),等待线程调度程序为其分配CPU时间片,并使其进入运行状态(Running)。...当线程获得CPU资源后,就会自动调用其对应的run()方法,开始执行线程代码。...当新线程启动并开始执行run()方法时,会通过回调机制来通知Thread类实例已经完成了线程执行,并且组织相应的资源回收等操作。...因此,在Java中调用start()方法时会执行run()方法,是由于Java语言本身的设计和多线程的实现方式而决定的。

    18130

    Struts2中action的方法执行两次

    最近在用struts2遇到一个怪问题,struts2的默认方法老是执行两次,搞了大半天都没有找到,在最后即将放弃时终于找打了,原来是响应的页面有 一个图片标签,而图片标签请求的地址不存在,它就默认再次请求了当前请求的...url,造成了两次执行struts2的方法。...为此特做下次笔记,给自己和大家 分享,同时还在网络上搜索其它几个造成的方法。...1,被响应的图片URL不存在,导致请求原谅url而执行两次; 2,ajax模式下,调用的action方法不能为get*方式命名,内中机理未知; 结论:action中方法最好不要以...3,提交标签中用到JS脚本去执行的话,如写成的话,submit要执行一次,οnclick="save()也要执行一次,去掉其中一个即可

    87720

    直接调用 Java 线程run() 方法会发生什么?

    本文将深入探讨如果直接调用线程run() 方法会发生什么。 先说结论:直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。...run() 方法 vs start() 方法 run()方法 run()方法包含了线程执行的代码。 直接调用run()方法不会启动一个新线程,它只是在当前线程执行run()方法体中的代码。...换句话说,直接调用run()方法相当于调用一个普通的方法,没有并发行为。 start()方法 start()方法会创建一个新的线程,并在新的线程执行run()方法。...直接调用 run() 方法 当thread.run()被调用时,输出“Thread is running”。这段代码在主线程执行,没有启动新的线程。...结论 直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。而调用 start() 方法则会启动一个新的线程,并在该线程执行 run() 方法的代码。

    16520

    【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程执行线程方法 | 主线程执行线程方法 )

    文章目录 一、判定当前线程是否是主线程 二、子线程执行线程方法 三、主线程执行线程方法 一、判定当前线程是否是主线程 ---- 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如下方法进行判定...Looper.getMainLooper() == Looper.myLooper()) { isMainThread = true; } 二、子线程执行线程方法...MessageQueue , 但是可以有多个 Handler ; 其中 MessageQueue 封装在 Handler 中 ; // 将订阅方法放到主线程执行...Handler(Looper.getMainLooper()); // 在主线程执行订阅方法 handler.post...invokeMethod(subscription, event); } }); 三、主线程执行线程方法 --

    1K10

    线程 start 和 run 方法到底有什么区别?

    今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者对这两个不是很理解的可以继续往下看。...而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。...该启动的线程不会马上运行,会放到等待队列中等待 CPU 调度,只有线程真正被 CPU 调度时才会调用 run() 方法执行。...那么你会问了,为什么要有两个方法,直接用一个 run() 方法不就行了吗!? 还真不行,如果直接调用 run() 方法,那就等于调用了一个普通的同步方法,达不到多线程运行的异步执行,来看下面的例子。...0 毫秒,而启动 run 方法则阻塞了 3000 毫秒等程序执行完再继续执行,这就是同步与异步的一个最重要的区别。

    1.4K10

    SpringApplication Run方法核心逻辑

    run方法逻辑 在上一篇文章中,我们看到SpringApplication的静态方法最终是去构造了一个SpringApplication实例对象,并调用了SpringApplication的成员方法...run方法的代码主要的逻辑,为后面其它内容做一个铺垫 跟进run方法,这个方法的代码有点长我们将抛弃掉一些比较次要的内容 public ConfigurableApplicationContext run...// Context容器refresh完毕发布 listeners.started(context); // 触发Context容器refresh完以后的执行...run方法描述了SpringApplication这个类的职责,包含了不少步骤,但简单的看其实就是为了创建并配置好一个ApplicationContext。...总结 我们忽略各种细节以后就会发现,SpringApplication的run方法主要就是为了构建出一个ApplicationContext,后续文章也将围绕着构建ApplicationContext相关的内容展开

    62330

    改变 Python 中线程执行顺序的方法

    上面的代码中只能保证每个线程都运行完整个 run 函数,但是线程的启动顺序、run 函数中每次循环的执行顺序都不能确定。...总结 每个线程默认有一个名字,尽管上面的例子中没有指定线程对象的 name,但是 python 会自动为线程指定一个名字。 当线程run() 方法结束时该线程完成。...但有时候,我们想让某个子线程执行,然后再让主线程执行代码,该如何实现呢? 很简单,通过调用线程对象的 join() 方法即可。...join() 方法的功能是在程序指定位置,优先让该方法的调用者使用 CPU 资源。...以上就是改变 Python 中线程执行顺序的方法的详细内容,更多关于改变 Python 中线程执行顺序的资料请关注179885.Com其它相关文章!

    2K40

    线程按顺序执行 8 种方法

    一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。...1.使用线程的join方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。...应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。...单线程线程池(newSingleThreadExecutor):优点,串行执行所有任务。 submit():提交任务。 shutdown():方法用来关闭线程池,拒绝新任务。...应用场景:串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

    2K20

    如何给run方法传参?如何处理线程的返回值?

    run()方法传参实现的方式主要有三种 构造函数传参 成员变量传参 回调函数传参 如何实现处理线程的返回值 主线程等待法 优点:实现简单 缺点需要自己实现循环逻辑,循环时间自己无法精准控制 使用...Thread类的join()阻塞当前线程以等待子线程处理完毕 通过Callable接口实现:通过FutureTask Or 线程池获取 通过FutureTask方法实现机制或者说基础 1.FutureTask...有个构造函数可以直接传Callable接口 2.FutureTask 的isDone()方法可以用来判断Callable接口实例的call是否执行完毕 3.FutureTask 有个方法是get(...),若call()没执行完毕会阻塞住,如果执行完会返回Callable实例返回值 线程池获取 原理和FurureTask差不多,通过线程池submit一个Callable实例会返回一个Future...Future也具有FutureTask相同的方法和功能 使用线程池的好处:``可以提交多个实现callable的类,让线程池并发处理, 方便管理 主线程等待法 join改造上面的主线程只需要替换那个

    2.7K30

    线程按顺序执行8种方法

    1.使用线程的join方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。 如果想学习Java工程化、高性能及分布式、深入浅出。...应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。...“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”) notify()和notifyAll():是Object的方法,作用则是唤醒当前对象上的等待线程...单线程线程池(newSingleThreadExecutor):优点,串行执行所有任务。 submit():提交任务。 shutdown():方法用来关闭线程池,拒绝新任务。...应用场景:串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

    1K20

    线程顺序执行

    使用的方法如下: [1] 使用线程的join方法 [2] 使用主线程的join方法 [3] 使用线程的wait方法 [4] 使用线程线程方法 [5] 使用线程的Condition(条件变量)方法...— 1 — 使用线程的 join 方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。...应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。...单线程线程池(newSingleThreadExecutor):优点,串行执行所有任务。 submit():提交任务。 shutdown():方法用来关闭线程池,拒绝新任务。...应用场景:串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

    2.9K30

    一个线程两次调用start()方法会出现什么情况?

    Java 的线程是不允许启动两次的,第二次调用必然会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。...Thread{ public ThreadJoinTest(String name){ super(name); } @Override public void run...线程到底是什么? 进程是程序的一次执行过程,是资源的基本单位; 进程包括线程线程是调度和分派的基本单位。...主要有: 线程自身的方法,除了 start,还有多个 join 方法,等待线程结束;yield 是告诉调度器,主 动让出 CPU;另外,就是一些已经被标记为过时的 resume、stop、suspend...之类,据我所知,在 JDK 最新版本中,destory/stop 方法将被直接移除。

    1.1K00
    领券