java 多线程Thread与runnable的区别

 更新时间:2017年08月18日 16:41:09   投稿:lqh  
这篇文章主要介绍了java 多线程Thread与runnable的区别的相关资料,java线程有两种方法继承thread类与实现runnable接口,下面就提供实例帮助大家理解,需要的朋友可以参考下

java 多线程Thread与runnable的区别

java中实现多线程的方法有两种:继承Thread类和实现runnable接口

1,继承Thread类,重写父类run()方法

  public class thread1 extends Thread {
 
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println("我是线程"+this.getId());
        }
    }
 
    public static void main(String[] args) {
        thread1 th1 = new thread1();
        thread1 th2 = new thread1();
        th1.run();
        th2.run();
    }
   }
 

run()方法只是普通的方法,是顺序执行的,即th1.run()执行完成后才执行th2.run(),这样写只用一个主线程。多线程就失去了意义,所以应该用start()方法来启动线程,start()方法会自动调用run()方法。上述代码改为:

 public class thread1 extends Thread {
    
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println("我是线程"+this.getId());
        }
    }
 
    public static void main(String[] args) {
        thread1 th1 = new thread1();
        thread1 th2 = new thread1();
        th1.start();
        th2.start();
    }
}

通过start()方法启动一个新的线程。这样不管th1.start()调用的run()方法是否执行完,都继续执行th2.start()如果下面有别的代码也同样不需要等待th2.start()执行完成,而继续执行。(输出的线程id是无规则交替输出的) 

2,实现runnable接口

public class thread2 implements Runnable {
 
    public String ThreadName;
    
    public thread2(String tName){
        ThreadName = tName;
    }
    
    
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println(ThreadName);
        }
    }
    
    public static void main(String[] args) {
        thread2 th1 = new thread2("线程A");
        thread2 th2 = new thread2("Thread-B");
        th1.run();
        th2.run();
    }
}

和Thread的run方法一样Runnable的run只是普通方法,在main方法中th2.run()必须等待th1.run()执行完成后才能执行,程序只用一个线程。要多线程的目的,也要通过Thread的start()方法(runnable是没有start方法)。上述代码修改为:

public class thread2 implements Runnable {
 
    public String ThreadName;
    
    public thread2(String tName){
        ThreadName = tName;
    }
    
    
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println(ThreadName);
        }
    }
    
    public static void main(String[] args) {
        thread2 th1 = new thread2("线程A");
        thread2 th2 = new thread2("Thread-B");
        Thread myth1 = new Thread(th1);
        Thread myth2 = new Thread(th2);
        myth1.start();
        myth2.start();
    }
}

 总结:实现java多线程的2种方式,runable是接口,thread是类,runnable只提供一个run方法,建议使用runable实现 java多线程,不管如何,最终都需要通过thread.start()来使线程处于可运行状态。

以上就是关于java多线程的实例详解,如有疑问请留言或者到本站社区交流讨论,本站关于线程的文章还有很多,希望大家搜索查阅,大家共同进步!

相关文章

  • 让你五分钟彻底理解Spring MVC

    让你五分钟彻底理解Spring MVC

    其实MVC就是处理Web请求的一种框架模式,如果你对MVC不太熟悉的话可以看下本文,这篇文章主要给大家介绍了关于如何让你五分钟彻底理解Spring MVC的相关资料,需要的朋友可以参考下
    2021-10-10
  • 关于Kill指令停掉Java程序的问题

    关于Kill指令停掉Java程序的问题

    这篇文章主要介绍了Kill指令停掉Java程序的思考,主要探究kill指令和java的关闭钩子的问题,需要的朋友可以参考下
    2021-10-10
  • 详解SpringBoot优雅编码之Lombok加持

    详解SpringBoot优雅编码之Lombok加持

    这篇文章主要介绍了详解SpringBoot优雅编码之Lombok加持,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Spring和MyBatis整合自动生成代码里面text类型遇到的坑

    Spring和MyBatis整合自动生成代码里面text类型遇到的坑

    Spring和MyBatis整合以后,使用自动生成代码工具生成dao和mapper配置文件。下面通过本文给大家介绍Spring和MyBatis整合自动生成代码里面text类型遇到的坑,需要的朋友参考下吧
    2018-01-01
  • Spring框架基于注解开发CRUD详解

    Spring框架基于注解开发CRUD详解

    这篇文章主要为大家详细介绍了Spring框架基于注解开发CRUD,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Maven添加Tomcat插件实现热部署代码实例

    Maven添加Tomcat插件实现热部署代码实例

    这篇文章主要介绍了Maven添加Tomcat插件实现热部署代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java并发编程专题(九)----(JUC)浅析CyclicBarrier

    java并发编程专题(九)----(JUC)浅析CyclicBarrier

    这篇文章主要介绍了java CyclicBarrier的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • javaWeb实现简单文件上传

    javaWeb实现简单文件上传

    这篇文章主要为大家详细介绍了JAVAWeb实现简单文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java实现读取和写入properties文件

    Java实现读取和写入properties文件

    这篇文章主要介绍了Java实现读取和写入properties文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java的LinkedHashSet源码深入讲解

    Java的LinkedHashSet源码深入讲解

    这篇文章主要介绍了Java的LinkedHashSet源码深入讲解,LinkedHashSet是HashSet的子类,而由于HashSet实现了Set接口,因此LinkedHashSet也间接实现了Set类,LinkedHashSet类属于java.base模块,java.util包下,需要的朋友可以参考下
    2023-09-09

最新评论