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

所属分类: 软件编程 / java 阅读数: 98
收藏 0 赞 0 分享

采用继承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。

更多精彩内容其他人还在看

Java基于反射机制实现全部注解获取的方法示例

这篇文章主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 信号量Semaphore的实现

这篇文章主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

eclipse+maven+spring mvc项目基本搭建过程

这篇文章主要介绍了eclipse+maven+spring mvc项目基本搭建过程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring boot集成swagger2生成接口文档的全过程

这篇文章主要给大家介绍了关于Spring boot集成swagger2生成接口文档的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java冒泡排序法和选择排序法的实现

这篇文章主要介绍了Java冒泡排序法和选择排序法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring Cloud Alibaba教程之Sentinel的使用

这篇文章主要介绍了Spring Cloud Alibaba教程之Sentinel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Josephus环的四种解法(约瑟夫环)基于java详解

这篇文章主要介绍了Josephus环的四种解法(约瑟夫环)基于java详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java继承Thread类创建线程类示例

这篇文章主要介绍了Java继承Thread类创建线程类,结合实例形式分析了java线程操作相关使用技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java使用Callable和Future创建线程操作示例

这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

springBoot使用JdbcTemplate代码实例

这篇文章主要介绍了springBoot使用JdbcTemplate代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多