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

当我在java中启动线程时,run()方法没有运行

在Java中,当启动一个线程时,可以通过继承Thread类或实现Runnable接口来创建一个线程类。在启动线程后,线程会执行其run()方法中的代码。

如果run()方法没有被调用或没有执行,可能是由于以下原因之一:

  1. 线程的start()方法没有被调用:在Java中,通过调用线程对象的start()方法来启动线程,而不是直接调用run()方法。如果只是调用run()方法,则会在当前线程中执行run()方法的代码,而不会创建新的线程。确保在启动线程时使用了start()方法。
  2. 线程对象已经被执行过:如果一个线程对象的start()方法已经被调用并且线程已经执行完毕,再次调用start()方法是无效的。每个线程对象只能启动一次。如果希望重新执行线程的代码,需要创建一个新的线程对象。

下面是一个示例代码,展示了在Java中启动线程的正确方式:

代码语言:txt
复制
public class MyThread extends Thread {
    public void run() {
        // 线程执行的代码
        System.out.println("线程执行中");
    }

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

在上述示例中,通过调用myThread.start()方法来启动线程,start()方法会自动调用线程对象的run()方法,并在新的线程中执行run()方法中的代码。输出结果为"线程执行中"。

对于上述问题,推荐腾讯云相关产品:

  • 腾讯云云服务器(CVM):腾讯云提供的灵活可扩展的云服务器,用于托管和运行您的Java应用程序。了解更多:https://cloud.tencent.com/product/cvm
  • 腾讯云弹性MapReduce(EMR):基于Hadoop和Spark的大数据处理平台,可用于并行处理Java应用程序中的大规模数据。了解更多:https://cloud.tencent.com/product/emr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Java线程面试问题和答案

    Q5线程的生命周期是什么? 当我java程序创建一个Thread实例,它的状态是新的。然后我们启动Thread,然后将状态更改为Runnable(准备运行但尚未运行)。...所以总而言之 , 一个线程可以的新的,可运行的,运行的,等待的,被阻止的和死的。 Q6javasleep和wait方法有什么区别? Wait方法释放锁,而sleep方法不释放锁。...答案是当你调用start()方法,main方法在内部调用run()方法启动新创建的Thread,所以run方法最终被新创建的Thread调用。...当你调用run()方法,它调用在同一个线程,当你调用start()方法,不会启动新的线程。 Q8用户线程和守护进程线程有什么区别? 当我java程序创建一个线程,它被称为用户线程。...当我们做一个变量volatile,所有的线程直接从内存读取它的值,而不是缓存它。这确保共享变量始终更新。 volatile是一个只能与变量一起使用的关键字。 Q11有可能两次启动一个线程吗?

    76120

    张三并发编程实践:创建高效的多线程世界

    使用这些方法,需要注意线程安全和同步问题,以避免出现意外的行为和性能问题。run()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法。...实际开发我们通常会重写run()方法来定义线程的逻辑,然后调用start()方法启动线程run()run()方法是Thread类的一个空方法,它表示线程要执行的任务。...Thread类run()方法是一个空方法,需要在子类重写。实现Runnable接口run()方法是接口中唯一的方法,用于定义线程要执行的操作。...当你创建一个Thread对象或实现Runnable接口的对象,需要重写run()方法来定义线程的任务。当线程启动,它将自动调用run()方法来执行任务。...当你调用一个Thread对象的start()方法Java虚拟机会创建一个新的线程,并调用该线程run()方法来执行任务。需要注意的是,不要直接调用run()方法启动线程

    34521

    每日一博 - 闲聊 Java 的中断

    ---- 概述 Java ,中断是一种线程协作方式 。 比如说,当线程 A 正在运行时,线程 B 可以通过中断线程 A,来指示线程 A 停止它正在执行的操作。...---- JDK 的线程池 ThreadPoolExecutor 内部是如何运用中断实现功能的 我们使用 ThreadPoolExecutor,程序运行结束,我们会调用它的 shutdown() 方法来关闭线程池...如果当前队列没有任务,这个方法会阻塞,也就是这个工作线程就会被阻塞。...当其他线程调用线程池的 shutDown() 方法,会中断阻塞到 workQueue.take() 方法的工作线程,然后这个工作线程就会从阻塞返回,并抛出 InterruptedException...当我们中断这类线程,被阻塞的线程会从阻塞状态返回,并抛出 InterruptedException 异常。

    16030

    Java线程面试问答

    例如,Servlet的性能上比CGI更好,因为Servlet的支持多线程,但CGI不支持。 3、用户线程和守护线程之间有什么区别? 当我Java程序创建线程,它被称为用户线程。...守护程序线程在后台运行,并且不会阻止JVM终止。当没有用户线程运行时,JVM会关闭程序并退出。从守护程序线程创建的子线程也是守护程序线程。 4、我们如何在Java创建线程?...当我Java程序创建线程,其状态为“new”。然后,我们启动将其状态更改为Runnable的线程线程调度程序负责将CPU分配给可运行线程池中的线程,使其状态更改为running(运行)。...可以,我们可以调用Thread类的run()方法,但是它的行为类似于普通方法。要在线程实际执行它,我们需要使用Thread.start()方法启动它。...Java没有线程监视程序,因此同步可以与任何Object一起使用,这就是为什么它是Object类的一部分的原因,因此Java的每个类都具有这些线程间通信的基本方法

    1.2K40

    java 线程 (一) 线程的简单使用

    我们只需要关注如何创建和启动一个线程,关于进程的创建等是不需要我们考虑的,当我启动一个 java 程序时,操作系统会创建进程。...比如我们执行 main() 方法,会启动 jvm 虚拟机,然后虚拟机执行我们的 main() 方法,虚拟机会分配一个线程来执行我们的 main() 方法,这个线程一般被称作主线程。...,两个线程几乎是同一启动同一刻停止,差不多都运行了 5 秒。...并在 run() 方法定义这个线程需要完成的任务。但是启动线程不是直接去调用线程实例的 run() 方法,而是通过调用 start() 方法启动线程。...如果我们直接在代码调用线程实例的 run() 方法,是没有线程的效果的,run() 方法直接就在 main 线程执行了,与执行一个普通方法没有什么区别。

    53720

    Java中用户线程和守护线程区别这么大?

    3.3 小结 守护线程是为用户线程服务的,当一个程序的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程 Java 体系权重是比较低的。...4.3 join 与守护线程 通过 3.2 部分的内容我们可以看出,默认情况下程序结束并不会等待守护线程执行完,而当我们调用线程的等待方法 join() ,执行的结果就会和 3.2 的结果有所不同,下面我们一起来看吧...通过上述结果我们可以看出,即使是守护线程,当程序调用 join() 方法,程序依然会等待守护线程执行完成之后再结束进程。...通过上述结果可以看出,线程的类型不管是守护线程还是用户线程对程序执行的优先级是没有任何影响的,而当我们将 t2 的优先级调整为最大,整个程序的运行结果就完全不同了,如下代码所示: public class...7.总结 Java 语言中线程分为用户线程和守护线程,守护线程是用来为用户线程服务的,当一个程序的所有用户线程都结束之后,无论守护线程是否工作都会跟随用户线程一起结束。

    78110

    浅聊线程中断

    初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行(running)两种状态笼统的称为“运行”。...就绪状态的线程获得CPU时间片后变为运行状态(running)。 3.阻塞(BLOCKED):表示线程阻塞于锁。...但是当我启动线程之后,情况就多了一些: 如果线程比主线程执行的快,中断前后仍然是返回false。...当我想到这里的时候,我还在想另外一个问题:Condition的await方法是让线程进入阻塞还是等待,从名字上看他好像是让线程等待,而不是阻塞,我们进入源码看一下,方法描述上有这么一句话:Block...和BLOCKED类似,对于中断操作只是设置中断标志位并没有强制终止线程,对于线程的终止权利依然程序手中。

    83010

    Java基础教程(15)-多线程基础

    Thread 实例: 从 Thread 派生一个自定义类,然后覆写 run() 方法 创建 Thread 实例,传入一个 Runnable 实例 线程状态 Java程序,一个线程对象只能调用一次...start() 方法启动线程,并在新线程执行 run() 方法。...因此,Java线程的状态有以下几种: New:新创建的线程,尚未执行; Runnable:运行线程,正在执行 run() 方法Java代码; Blocked:运行线程,因为某些操作被阻塞而挂起...; Waiting:运行线程,因为某些操作等待; Timed Waiting:运行线程,因为执行 sleep() 方法正在计时等待; Terminated:线程已终止,因为 run() 方法执行完毕...为什么要对线程间共享的变量用关键字 volatile 声明? Java虚拟机,变量的值保存在主内存,但是,当线程访问变量,它会先获取一个副本,并保存在自己的工作内存

    8410

    简说Java线程的那几个启动方式

    所以,让我们来好好看看在Java启动线程的那几个方式与介绍。...,官网希望,对于线程启动,使用者是通过 start 的方式来启动线程,因为这个方法会让Java虚拟机会调用这个线程run 方法。...其结果就是,一个线程运行 start 方法,而另一个线程则取运行 run 方法。同时对于这样线程Java官方也说了,线程是不允许多次启动的,这是不合法的。...它将为各个类提供一个协议,就像 Thread 一样,其实当我们的类实现了 Runnable 的接口后,我们的类与 Thread 是同级,只是可能仅有 run 方法,而没有 Thread 提供的跟丰富的功能方法...我加多了一行 fun.run(); 代码,同时 MyCallable 类,将方法加一个时间线程去等待3s。 结果是: 结果只输出了一次,同时 get 方法需要等运行3s后才有返回。

    39740

    Java】基础32:一道面试题,弄懂线程的创建原理

    代表着线程启动了,同时Java虚拟机会调用run方法,执行run方法里的内容。 这也很好理解,不然线程只是启动了,没输出,要它有何用?...现在明白Thread的run方法了吧: ①如果Thread对象创建没有初始化赋值: 那么它的run方法里是没有输出的(因为并没有传值给target),也就是光启动了一个线程,啥都没有。...它重写了Thread的run方法。 好现在问题来了: ①是相当于给Threadrun方法填充内容。 ②是重写Thread的run方法运行结果是啥?...父类引用指向子类对象,调用方法,执行的是子类重写后的方法,这是多态里的知识点,也就是说②将①给覆盖了。 还记得那句口诀么?编译看左边,运行看右边 ②左边是啥?Thread引用,也就是父类引用。...运行看右边,右边是Thread的子类对象,所以运行时执行的就是子类对象的方法。 好现在做一个小结: Thread的start方法启动Java虚拟机会调用Thread的run方法,输出内容。

    44940

    ThreadLocal不好用?那是你没用对!

    使用场景1:本地变量 我们以多线程格式化时间为例,来演示 ThreadLocal 的价值和作用,当我多个线程中格式化时间,通常会这样操作。...当我们怀着无比喜悦的心情去运行程序的时候,却发现意外发生了,这样写代码竟然会出现线程安全的问题。从上述结果可以看出,程序的打印结果竟然有重复内容的,正确的情况应该是没有重复的时间才对。 ​...要理解这个问题,需要从 ThreadLocal.get() 方法的源码得到答案,因为初始化方法 initialValue ThreadLocal 创建并不会立即执行,而是调用了 get 方法只会才会执行...从上述打印的时间可以看出:initialValue 方法并不是 ThreadLocal 创建执行的,而是调用 Thread.get 方法才执行的。...从上述结果可以看出,当我线程先初始化了 User 对象之后,订单类和仓储类无需进行任何的参数传递也可以正常获得 User 对象了,从而实现了一个线程,跨类和跨方法的数据传递。

    52020

    Java线程一:基础知识与线程创建的几种方式

    线程进程 进程概念 进程就是运行的程序,程序是由一段指令组成 线程概念 线程必须依赖于进程,进程存在,线程才存在 进程和线程的区别 进程是系统资源分配的基本单位,线程是CPU调度的基本单位,一个进程可以包含多个线程...进程的几种状态 一共五种状态:新建 ,就绪 ,运行,阻塞,终止 其中三种基本状态:就绪,运行,阻塞 线程的几种状态 线程的状态: Thread类源码定义了6种 public enum State {...超时等待 TERMINATED;// 停止 } 注意:Java,将就绪状态与运行状态统称为运行 获取电脑逻辑处理器的数量: Runtime.getRuntime().availableProcessors...缺点:扩展性太差,Java类只能单继承 2....= null) { target.run(); } } 这里就可以看出来,当我们的Runnable 不为空的时候,执行的是Runnable里面的run方法,这个target

    23840

    一个ScheduledExecutorService启动Java线程无故挂掉引发的思考

    2018年12月12日18:44:53 一个ScheduledExecutorService启动Java线程无故挂掉引发的思考 案件现场 不久前,开发改造公司一个端到端监控日志系统的时候,出现了一个...顺藤摸瓜 我看了很久的代码,都没有想出来有什么地方有逻辑问题。万金油的方法是,重启。当我满心欢喜地认为重启是个好方法的时候,问题又重现了。...到这里,看似问题已经解决了,但是问题并没有那么简单。 寻根问底 上面说到的在线程抛出了NullPointerException异常,解决方法是增加一个判断是否为空的条件就可以了。...也就是说,如果使用者抛出异常,ScheduledExecutorService 将会停止线程运行,而且不会报错,没有任何提示信息。 这就是日志中和控制台都没有看到打印异常信息的原因。...启动Java线程无故挂掉的原因是:如果使用者抛出异常,ScheduledExecutorService 将会停止线程运行,而且不会报错,没有任何提示信息。

    75410

    Java线程线程的生命周期 | 图解

    点关注 Java 初中级面试,关于线程的生命周期可以说是常客了。本文就针对这个问题,通过图文并茂的方式详细说说。...; 很多人以为当我代码new一个Thread的时候,就代表着thread线程处于NEW状态了,实际上是大错大错的!...二、RUNNABLE 状态 当我代码显式的调用start()方法后,JVM 进程会去创建一个新的线程,而此线程不会马上被 CPU 调度运行,进入 RUNNING 状态,这里会有一个中间状态,就是...三、RUNNING 状态 当 CPU 调度发生,并任务队列中选中了某个 RUNNABLE 线程,该线程会进入 RUNNING 执行状态,并且开始调用run()方法逻辑代码。...也就是说如果不等于 0,直接抛线程状态异常; ②:线程启动后被加入到 ThreadGroup ; ③: start0 是最核心的方法了,就是运行状态为 NEW (内部状态标识为 0) 的线程; ④:

    62410

    Java线程线程安全、线程状态

    代码如下: 自定义线程类: 测试类: 流程图: 程序启动运行 main 时候, java 虚拟机启动一个进程,主线程 main main() 调用时候被创建。...扩充: java ,每次程序运行至少启动 2 个线程。一个是 main 线程,一个是垃圾收集线程。...因为 每当使用 java 命令执行一个类的时候,实际上都会启动一个 JVM ,每一个 JVM 其实在就是操作系统启动 了一个进 1.5 匿名内部类方式实现线程的创建 使用线程的内匿名内部类方式...我们写卖票的案例,为了减少线程执行太快,现象不明显等问题,我们 run 方法添加了 sleep 语句,这样就 强制当前正在执行的线程休眠( 暂停执行 ),以 “ 减慢线程 ” 。...当多个线程协作,比如 A , B 线程,如果 A 线程 Runnable (可运行)状态调用了 wait() 方法那 么 A 线程就进入 了 Waiting (无限等待)状态,同时失去了同步锁

    1.7K30

    Java线程(一)

    思考:为什么运行我们运行java程序的时候要先启动JVM虚拟机? ?...注:java创建出来的线程默认是用户线程,但是启动线程前可以通过特定方法(setDaemon)把该线程转为守护线程   2.3、名字叫"main"的线程     当我运行一个java程序的时候,...三、Thread类和Runnable接口   3.1、Thread类run方法     线程对象run方法,就是线程独立运行之后,必须要执行的方法,如果我们有什么代码要交给一个线程独立运行,那么就需要把这些代码放到...run.  3.2、Thread类的start方法           代码,我们并不能直接调用一个线程对象的run方法,而且需要调用线程对象的start方法启动这个线程,然后这个线程会自动的调用...void run() 线程要执行的代码在此方法 注:我们并不能直接调用run方法,而且启动线程后让线程自动调用run方法 public

    59480

    Java游戏编程不完全详解-1

    ,最后呼叫了该线程对象的run()方法,但是run方法没有做任何事情。...; } } 以上示例MyClass对象构造方法启动了一个新的线程。 Thread类把Runnable对象作为它的构造方法的参数,而Runnable对象是线程启动执行。...比如我们某些事情需要上锁,而不让”this”对象上锁,或者当我们不需要让整个方法被同步。锁可以适用所有对象,包括数组,除了原始数据类型。...然后任务在下一下空闲 的线程执行。该方法线程安全的。 任务开始执行时有序的到达开始。 @参数task表示运行的任务。...VS Code运行效果如下: 补充Executors框架 《Mastering Concurrency Programming with Java 8》一书中介绍一个Executor的并发框架

    81330
    领券