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

为什么子类化Thread比调用Thread慢得多?

子类化Thread比调用Thread慢得多的原因是因为子类化Thread需要继承Thread类并重写其run()方法,而调用Thread只需要传入一个Runnable对象。这涉及到Java中的继承和多态机制。

当子类化Thread时,需要创建一个新的类并继承Thread类,然后重写run()方法来定义线程的执行逻辑。这样做的好处是可以更灵活地控制线程的行为,但也带来了一些额外的开销。

首先,子类化Thread会增加类的数量,导致更多的内存占用。每个子类化的Thread对象都会占用一定的内存空间,而调用Thread只需要创建一个Runnable对象,内存占用更少。

其次,子类化Thread需要进行类的加载和初始化过程,而调用Thread只需要创建一个Runnable对象并传入Thread构造函数中。类的加载和初始化过程涉及到类加载器的工作,会消耗一定的时间和资源。

另外,子类化Thread还需要重写run()方法来定义线程的执行逻辑,这会增加方法调用的开销。每次调用子类化Thread的start()方法时,都会调用子类中的run()方法,而调用Thread只需要执行传入的Runnable对象的run()方法。

综上所述,子类化Thread比调用Thread慢得多是因为它涉及到类的继承和重写方法的过程,增加了内存占用、类加载和初始化的开销,以及方法调用的额外开销。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云容器服务(TKE):基于Kubernetes的容器管理服务,简化容器化应用的部署和管理。产品介绍链接
  • 腾讯云函数计算(SCF):无服务器计算服务,帮助开发者更轻松地构建和运行事件驱动型应用程序。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?

调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?...{ private char name[]; public Thread() { init(null, null, "Thread-" + nextThreadNum...{ public MyThread() { super(); } } 由以上可知,由MyThread my1 = new MyThread(); 第一次调用无参构造的时候...,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread-0,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。...同理,MyThread my2 = new MyThread(); 第二次调用无参构造的时候,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread

78920

QThread 的使用「建议收藏」

run threadID: 0x3e30 Thread::fun threadID: 0x3e30 Thread::slotFun threadID: 0x3e30 为什么会有这样的结果呢?...相信大家看完输出结果和原因分析之后,应该能理解为什么是这样的输出了。...对象的成员函数,但却被它所创建的线程调用。...对于子类化 Thread 的方式 这种方式适用于一些任务场景: 很多经典线程问题(生产者,消费者等) 独立不依赖的一些工作任务 这种方式有一些特点: 不需要事件循环,一次性的执行 不需要被调用槽函数 可以自己定义...run() 函数的实现 这种方式有一些陷阱: 提供槽函数,子类化对象是属于主线程的,又没有事件循环,所以槽函数会被主线程执行 调用 moveToThread(this) 对于 worker move

1.1K20
  • QThread的用法

    ,给线程发送信号,线程收到了信号开始执行,其线程号为0X1218,执行结束后发送信号给Controller处理结果。...然而有趣的是,myThread.start()之后我又从主函数触发了一个信号,对应于线程的槽,线程的槽函数中打印当前执行的线程的编号,可以看到,执行线程的槽函数的线程编号却是主线程的编号。...子类化QThread的方法,就是重写了QThread中的run()函数,在run()函数中定义了需要的工作。这样的结果是,我们自定义的线程调用start()函数后,便开始执行run()函数。...如果在自定义的线程类中定义相关槽函数,那么这些槽函数不会由子类化的QThread自身事件循环所执行,而是由该线程的拥有者所在线程(一般都是主线程)来执行。...如果你不明白的话,请看,第二个例子中,子类化的线程的槽函数中输出当前线程的ID,而这个ID居然是主线程的ID!!

    86420

    python线程笔记

    即使任务相互独立,互相无关(即,一个任务的结果不影响其它 任务的结果)时也是这样。...为什么我们不在创建锁的循环里创建线程呢?有以下几个原因: 1.我们想到实现线程的同步,所以要让“所有的马同时冲出栅栏”。...即,在线程开始(调用 thread.start())之前,调用 setDaemon()函数设定线程的 daemon 标志 (thread.setDaemon(True))就表示这个线程“不重要” 如果你想要等待线程完成再退出...你可以调用 thread.isDaemon()函数来判 断其 daemon 标志的值。新的线程会继承其父线程的 daemon 标志。...相对于一个或几个函数来说,由于类 对象里可以使用类的强大的功能,可以保存更多的信息,这种方法更为灵活 最后一个例子介绍如何子类化 Thread 类,这与上一个例子中的创建一个可调用的类非常像。

    1.3K50

    python3.9多线程_python多线程没用

    一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 为什么要使用多线程? 线程在程序中是独立的、并发的执行流。...操作系统在创建进程时,必须为进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发使用多进程的性能高得要多。...操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。...,花费时间要短 当调用start()时,才会真正的创建线程,并且开始执行 函数式创建多线程 python中多线程使用threading模块,threading模块调用Thread类 self, group...t1,t2 最后打印线程数为1个,是因为线程都结束了,就剩主线程了 自定义线程 继承threading.Thread来定义线程类,其本质是重构Thread类中的run方法 为什么执行run方法

    1K10

    翻译 | 您没有做错(线程)

    Brad上任后,该社区的一些成员就反对对QThread进行子类化进行了讨伐。问题在于,有很多完全合法的原因可以继承QThread。   ...Qt线程示例threadedfortuneserver是使用此模式运行阻塞操作的示例,并且使用worker对象的等效示例要简单得多。   ...我已经向文档提交了补丁, 以免再次阻止对QThread的子类化。 经验法则 ---- 什么时候子类化,什么时候不子类化? 如果您确实不需要线程中的事件循环,则应该子类化。...如果需要事件循环并处理线程中的信号和槽,则可能不需要子类化。 改用QtConcurrent呢?   QThread的级别很低,您最好使用更高级别的API,例如QtConcurrent。   ...一个很好的选择也是C ++ 11与标准库 std::thread 和std::async它们现在在一个线程中运行的代码的标准方式。

    62510

    qt多线程编程实例_lgbt

    使用QReadWriteLock而不是QMutex,可以使得多线程程序更具有并发性。 QReadWriterLock默认模式是NonRecursive。...信号量互斥量有更好的并发性,假如我们用互斥量来控制对缓冲的访问,那么生产者、消费者不能同时访问缓冲区。然而,我们知道在同一时刻,不同线程访问缓冲的不同部分并没有什么危害。...可以用QObject::thread()方法获取一个QObject所处的线程。 QObject::moveToThread()函数改变一个对象和及其对象的线程所属性。...A、子类化 QThread B、重写run 使其调用 QThread::exec() ,开启线程的事件循环 C、为子类定义信号和槽,由于槽函数并不会在新开的 Thread 运行,在构造函数中调用...而从Qt4.4开始,QThread不再支持抽象类,run 默认调用 QThread::exec() ,不需要子类化 QThread,只需要子类化一个 QObject 。

    1.5K10

    Python - 多线程

    为什么要使用多线程 线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。...操作系统在创建进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发使用多进程的性能要高得多。...操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行使用多进程的效率高。...主线程等待线程结束 为了让守护线程执行结束之后,主线程再结束,我们可以使用join方法,让主线程等待线程执行。...Python多线程的工作过程: python在使用多线程的时候,调用的是c语言的原生线程。

    64620

    python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02

    开进程 开线程 开启线程的两种方式 方式一 方式二 线程之间数据共享 线程对象的其他属性和方法 守护线程 主线程运行结束之后为什么需要等待线程结束才能结束呢?...测试 线程互斥锁 不加锁遇到延迟的情况 加锁后遇到延迟 为什么用互斥锁不用 线程/进程对象.join() 进程补充 进程通信前言 要想实现进程间通信,可以用管道或者队列 队列管道更好用(队列自带管道和锁...(t) # 可以考虑用类调用对象方法,传入对象来在循环里对线程对象进行操作 守护线程 主线程要等待所有非守护线程结束后才会结束(不是主线程的代码执行完了就立马结束了) 主线程结束后,守护()线程也会立即结束...主线程运行结束之后为什么需要等待线程结束才能结束呢?...主 # # GG # # GG # 主线程运行结束之后为什么需要等待线程结束才能结束呢?

    59740

    多线程与多进程 | 多线程

    一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以进程之间更方便地共享数据以及相互通讯。线程一般都是并发执行的,正是由于这种并行和数据共享的机制使得多个任务的合作变成可能。 ?...这个类可以以有限的方式安全地子类化。有两种方法 指定活动:通过传递一个可调用对象给构造函数,或通过重写子类中的run()方法。...**target:**表示一个可调用对象,线程启动时,run()方法将调用此对象,默认为None,表示不用调用任何内容。...start()函数前调用) 用Thread类,可以用多种方法来创建线程。...输出 -----主线程开始----- 线程Thread-5执行任务0 线程Thread-4执行任务0 线程Thread-5执行任务1 线程Thread-4执行任务1 线程Thread-4执行任务

    95820

    python3--threading模块(线程)

    有了进程为什么要有线程  进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?...3)调度和切换:线程上下文切换进程上下文切换要快得多。   ...3 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。...创建和销毁线程、线程切换代价等线程管理的代价内核线程少得多。 允许每个进程定制自己的调度算法,线程管理比较灵活。 线程能够利用的表空间和堆栈空间内核级线程多。...thread模块不支持守护线程,当主线程退出时,所有的线程不论它们是否还在工作,都会被强行退出。

    2.2K20

    进程的描述和创建

    这样做得目的是为了提高进程创建的效率,因为进程全部拷贝父进程的地址空间非常且效率低,实际上,进程几乎不必读或修改父进程拥有的所有资源,在很多情况下,进程立即调用execve(),并清除父进程之前拷贝过来的地址空间...这里为什么要介绍写时复制呢?   ...,这里为什么要让进程先执行呢?   ...调用copy_thread(),将保存在父进程的内核栈中的CPU寄存器的值来初始化子进程的内核栈,将eax寄存器置0,进程返回值为0,将ret_from_fork()的地址存放在thread.eip字段...清除进程thread_info结构的TIF_SYSCALL_TRACE标志,使ret_from_fork()函数不会把系统调用结束的消息通知给调试进程。

    89430

    Python 异步: 协程(4)

    协程和例程都可以调用自己的其他实例。一个子程序可以调用其他子程序。协程执行其他协程。但是,协程也可以执行其他例程。当一个协程执行另一个协程时,它必须暂停执行并允许另一个协程在另一个协程完成后恢复。...这就像一个子程序调用另一个子程序。不同之处在于协程的暂停可能允许任意数量的其他协程也运行。这使得调用另一个协程的协程调用另一个例程的例程更强大。它是协同程序促进的协作多任务处理的核心。3....调用协程可以继续执行指令而不是等待另一个协程。Task 不能单独存在,它必须包装一个协程。因此,Task 是协程,但协程不是任务。5. 协程与线程协程线程更轻量级。...Thread:由操作系统管理,由 Python 对象表示。这意味着协程通常可以更快地创建和开始执行并且占用更少的内存。反之,线程的创建和启动速度协程,占用的内存也更多。...这意味着协程的创建和启动速度明显快于进程,并且占用的内存也少得多。协程只是一个特殊的函数,而进程是至少有一个线程的解释器实例。7.

    82620

    Python 异步: 协程(4)

    协程和例程都可以调用自己的其他实例。一个子程序可以调用其他子程序。协程执行其他协程。但是,协程也可以执行其他例程。当一个协程执行另一个协程时,它必须暂停执行并允许另一个协程在另一个协程完成后恢复。...这就像一个子程序调用另一个子程序。不同之处在于协程的暂停可能允许任意数量的其他协程也运行。这使得调用另一个协程的协程调用另一个例程的例程更强大。它是协同程序促进的协作多任务处理的核心。 3....调用协程可以继续执行指令而不是等待另一个协程。Task 不能单独存在,它必须包装一个协程。因此,Task 是协程,但协程不是任务。 5. 协程与线程 协程线程更轻量级。...反之,线程的创建和启动速度协程,占用的内存也更多。协程在一个线程内执行,因此一个线程可以执行多个协程。 6. 协程与进程 协程进程更轻量级。事实上,线程进程更轻量级。进程是计算机程序。...这意味着协程的创建和启动速度明显快于进程,并且占用的内存也少得多。协程只是一个特殊的函数,而进程是至少有一个线程的解释器实例。 7.

    62430

    python多线程菜鸟教程_python实现多线程有几种方式

    一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 ''' ''' 为什么要使用多线程? 线程在程序中是独立的、并发的执行流。...操作系统在创建进程时,必须为改进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程 来实现并发使用多进程的性能高得要多。...操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。...GIL只在cpython中才有,因为cpython调用的是c语言的原生线程,所以他不能直接操 作cpu,而只能利用GIL保证同一时间只能有一个线程拿到数据。...而在pypy和jpython中是没有GIL的 python在使用多线程的时候,调用的是c语言的原生过程。

    73510

    python多线程详解(超详细)

    一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 ''' ''' 为什么要使用多线程? 线程在程序中是独立的、并发的执行流。...操作系统在创建进程时,必须为改进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程 来实现并发使用多进程的性能高得要多。...操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。...GIL只在cpython中才有,因为cpython调用的是c语言的原生线程,所以他不能直接操 作cpu,而只能利用GIL保证同一时间只能有一个线程拿到数据。...而在pypy和jpython中是没有GIL的 python在使用多线程的时候,调用的是c语言的原生过程。

    42120

    【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」

    2 NormalPriority调度频率低 QThread::NormalPriority 3 操作系统的默认优先级 QThread::HighPriority 4 NormalPriority调度频繁...子类化QThread的方法,就是重写了QThread中的run()函数,在run()函数中定义了需要的工作。这样的结果是,我们自定义的线程调用start()函数后,便开始执行run()函数。...如果在自定义的线程类中定义相关槽函数,那么这些槽函数不会由子类化的QThread自身事件循环所执行,而是由该线程的拥有者所在线程(一般都是主线程)来执行。...如果你不明白的话,请看,第二个例子中,子类化的线程的槽函数中输出当前线程的ID,而这个ID居然是主线程的ID!!...事实的确是如此,子类化的QThread只能执行run()函数中的任务直到run()函数退出,而它的槽函数根本不会被自己的线程执行。

    7.6K21

    python 线程(一)理论部分

    既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的。...3)调度和切换:线程上下文切换进程上下文切换要快得多。   ...创建和销毁线程、线程切换代价等线程管理的代价内核线程少得多。 允许每个进程定制自己的调度算法,线程管理比较灵活。 线程能够利用的表空间和堆栈空间内核级线程多。...(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的线程退出后进程才退出...thread模块不支持守护线程,当主线程退出时,所有的线程不论它们是否还在工作,都会被强行退出。

    91420

    阿里将 TVM 融入 TensorFlow,在 GPU 上实现全面提速

    我们在生产环境中发现初版 Transformer 的推理速度大约 LSTM 版本 1.5 倍到 2 倍。...batch 矩阵相乘 为什么选择利用 batch 矩阵相乘 在 Transformer 中,batch 矩阵相乘被广泛应用于 multi-head attention 的计算。...< batch_dimension; ++i) { DoGemm(A[i],B[i],C[i],M,K,N) } } batch 矩阵相乘形状 在语言翻译任务中,batch 矩阵相乘的形状在其他工作负载下的常规矩阵相乘计算要小得多...即使形状不同(在 M、N、K 间变化),所有 maxwell_sgemmBatched_128x128_raggedMn_tn 调用执行的都是相同的 FLOP 数,这理论值大得多。...将 batch 矩阵相乘与其他运算融合 现有的「黑盒」cuBLAS 库调用一般会作为常用的「op 融合」优化策略的边界。

    1.5K20

    Qt高并发

    8)如果各QObject具有不同的线程关联,那么就不能以父—关系来连接它们。 9)通过从run()函数直接或者间接调用QThread::exec(),可以让线程进入事件循环。...其各对象也必须属于同一线程。Qt禁止跨线程的父——关系。 1)QObject::thread()可返回它的所有者线程,或者是其关联线程。...另外一种让代码在单独的线程内运行的方法是子类化QThread并重新实现run()函数。...因此,想要在新线程中调用槽函数的开发者必须使用worker对象的方法;新的槽函数不应该被直接实现成子类化的QThread。...在次线程中使用Qt的类 当函数可以同时被不同的线程安全地调用时,就称其为”线程安全的“(thread-safe)。

    1.5K20
    领券