Java 创建线程的三种方式总结

Java 创建线程的三种方式总结Java 创建线程的三种方式总结我们在开发中 为了提高程序的运行效率 经常会使用多线程的方式来实现并发操作 那么创建线程有几种方式呢 1 继承 Thread 类直接继承 Thread 即可实现多线程 Thread 本质上也是实现了 Runnable 接口 线程启动的唯一方法是通过 Thread 类的 start 实例方法实现的 start 方法调用时 系统才会真正创建一个新线程 并执行 run 方法 它是一个 native 方法 classMyThrea

Java 创建线程的三种方式总结


我们在开发中,为了提高程序的运行效率,经常会使用多线程的方式来实现并发操作。

那么创建线程有几种方式呢?

1、继承 Thread 类

直接继承 Thread 即可实现多线程。Thread 本质上也是实现了 Runnable 接口,线程启动的唯一方法是通过 Thread 类的 start() 实例方法实现的。start() 方法调用时,系统才会真正创建一个新线程,并执行 run() 方法,它是一个native方法。

 class MyThread extends Thread { @Override public void run() { super.run(); } } private void testThread(){ Thread thread = new MyThread(); thread.start(); } 

这种方式的缺点就是,Java 的单继承限制,想通过 Thread 实现多线程,就只能继承 Thread 类,不可继承其他类。

2、实现 Runnable 接口

如果自己的类已经继承了其他类,这时就只能通过实现 Runnable 接口来实现多线程了。

不过,继承 Runnable 接口后,想要启动线程,需要把该类的对象作为参数,传递给 Thread 的构造函数,并使用 Thread 类的实例方法 start 来启动。

public class TestThread extends A implements Runnable { public void run() { …… } } //启动线程 TestThread testThread = new TestThread(); Thread thread = new Thread(testThread); thread.start(); 

Thread 内部的 run 方法我们可以看到它的实现原理:

private Runnable target; public void run() {   if (target != null) {    target.run();   } } 

target 是我们传递进来的 Runnable 对象,当线程执行时,线程的 run 方法会直接调用 Runnable 对象的 run 方法。

3. 实现 Callable 接口

如果想要执行的线程有返回,怎么处理呢?这时应该使用 Callable 接口了,与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。

public class MyCallable implements Callable 
   
     { public Integer call() { return 111; } } public static void main(String[] args) throws ExecutionException, InterruptedException { MyCallable mc = new MyCallable(); FutureTask 
    
      ft = new FutureTask<>(mc); Thread thread = new Thread(ft); thread.start(); System.out.println(ft.get()); } 
     
   

比较

这几种线程创建方式中,实现接口会更好一些,因为:

  • Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口。
  • 类可能只要求可执行就行,继承整个 Thread 类开销过大。
  • 另外,如果需要有返回值时,使用 Callable 接口是适合的。

总结


本节我们回顾了,Java中创建线程的几种方式。

  • 继承 Thread 类
  • 实现 Runnable 接口
  • 实现 Callable 接口

PS:更多精彩内容,请查看 –> 《Java 技术点合集》
PS:更多精彩内容,请查看 –> 《Java 技术点合集》
PS:更多精彩内容,请查看 –> 《Java 技术点合集》




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176391.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:02
下一篇 2026年3月26日 下午10:03


相关推荐

  • mysql修复表的三个方法

    mysql修复表的三个方法

    2022年2月10日
    127
  • Proxifier设置代理上网详细操作

    Proxifier设置代理上网详细操作分享知识传递快乐 Proxifier 配置上网代理 Proxifier 是一款功能非常强大的 socks5 客户端 可以让不支持通过代理服务器工作的网络程序能通过 HTTPS 或 SOCKS 代理或代理链 支持 Xp Vista Win7 支持 socks4 socks5 http https 代理协议 支持 TCP UDP 协议 可以指定端口 指定 IP 指定程序等运行模式 兼容性非常好 本人因公司需要

    2026年3月18日
    2
  • CString::ReverseFind()和CString::Find()区别「建议收藏」

    CString::ReverseFind()和CString::Find()区别「建议收藏」Find()是从左往右查找;ReverseFind()是从右边往左查找,但是他们返回的地址都是从左往右数的。示例:[cpp]#include“stdafx.h”#include”afx.h”intmain(intargc,char*argv){CStringstr=”abcdabcd”;inta=str.Find(‘b’);printf(“

    2022年6月16日
    33
  • BN 层原理解析_解析器

    BN 层原理解析_解析器1训练数据为什么要和测试数据同分布?看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗?2为什么白化训练数据能够加速训练进程如下图,训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个…

    2022年10月9日
    5
  • 最新Claude注册攻略详解,快速入门必看技巧

    最新Claude注册攻略详解,快速入门必看技巧

    2026年3月15日
    2
  • H3C交换机配置telnet

    H3C交换机配置telnet1、telnet配置方法(常用方法):&lt;H3C&gt;sysSystemView:returntoUserViewwithCtrl+Z.[H3C]telnetserverenable   //使能telnet服务[H3C]user-interfacevty0   //设置telnet[H3C-ui-vty0-4]authentication-modenone[H…

    2022年6月20日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号