Java创建多线程的两种方式对比

 更新时间:2014年10月31日 09:52:01   投稿:hebedich  
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?这就是本文需要探讨的内容范畴了,看官们请仔细向下看

采用继承Thead类实现多线程:

优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。

劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。

示例代码:

复制代码 代码如下:

 package org.frzh.thread;
 
 public class FirstThread extends Thread{
     private int i;
    
     //重写run方法,run方法的方法体就是线程执行体
     public void run() {
         for (; i < 100; i++) {
             //当线程类继承Thread类时,可以直接调用getName方法获得当前线程名
             //如果想获得当前线程,直接使用this
             //Thread对象的getName方法返回当前线程的名字
             System.out.println(getName() + " " + i);
         }
     }
    
     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             //调用Thead的currentThread方法获取当前线程
             System.out.println(Thread.currentThread().getName() + " " +i);
             if (i == 20) {
                 new FirstThread().start();
                 new FirstThread().start();
             }
         }
     }
 }

运行结果片段:

我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。

采用实现Runable接口的多线程:

优势:线程类只是实现了Runable接口,因此还可以继承其他类;

         在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。

劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。

示例代码:

复制代码 代码如下:

 package org.frzh.thread;
 
 public class SecondThread implements Runnable{
     private int i;
    
     @Override
     public void run() {
         // TODO Auto-generated method stub
         for (; i < 100; i++) {
             System.out.println(Thread.currentThread().getName() + " " + i);
         }
     }
    
     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             System.out.println(Thread.currentThread().getName() + " " + i);
             if (i == 20) {
                 SecondThread st = new SecondThread();
                 new Thread(st, "子线程1").start();
                 new Thread(st, "子线程2").start();
             }
         }
     }
 
 }

运行结果片段:

可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。

相关文章

  • SpringBoot全局异常处理机制和配置拦截器方式

    SpringBoot全局异常处理机制和配置拦截器方式

    这篇文章主要介绍了SpringBoot全局异常处理机制和配置拦截器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • IDEA远程部署调试Java应用程序的详细流程

    IDEA远程部署调试Java应用程序的详细流程

    这篇文章主要介绍了IDEA远程部署调试Java应用程序,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Java 超详细讲解设计模式之原型模式讲解

    Java 超详细讲解设计模式之原型模式讲解

    原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,今天通过本文给大家介绍下Java 原型设计模式,感兴趣的朋友一起看看吧
    2022-03-03
  • 手把手教你如何利用SpringBoot实现审核功能

    手把手教你如何利用SpringBoot实现审核功能

    审核功能经过几个小时的奋战终于完成了,现在我就与广大网友分享我的成果,这篇文章主要给大家介绍了关于如何利用SpringBoot实现审核功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 浅析Java方法传值和传引用问题

    浅析Java方法传值和传引用问题

    这篇文章主要是对Java方法传值和传引用问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • Mybatis的collection三层嵌套查询方式(验证通过)

    Mybatis的collection三层嵌套查询方式(验证通过)

    这篇文章主要介绍了Mybatis的collection三层嵌套查询方式(验证通过),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • springCloud集成nacos启动时报错原因排查

    springCloud集成nacos启动时报错原因排查

    这篇文章主要介绍了springCloud集成nacos启动时报错原因排查,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java21新特性Record Patterns示例详解

    Java21新特性Record Patterns示例详解

    这篇文章主要为大家介绍了Java21新特性Record Patterns示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot异步实现的8种方式

    SpringBoot异步实现的8种方式

    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,本文主要介绍了SpringBoot异步实现的8种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • POS机如何与Java交互的方式探讨

    POS机如何与Java交互的方式探讨

    本文深入探讨POS机与Java语言的交互机制,详细介绍了通过RESTfulAPI、Socket编程和消息队列等方式实现数据交换和功能调用,文章还包含了代码示例、状态图与关系图,帮助开发者理解和实现POS机与Java之间的高效交互
    2024-09-09

最新评论