Java多线程的实现方式比较(两种方式比较)
先看一下java线程运行时各个阶段的运行状态
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。
在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
多线程主要是为了节约CPU时间,发挥利用,线程的运行中需要使用计算机的内存资源和CPU。
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
java实现多线程有两种方法
1、继承Thread类
2、实现Runnable接口
这两种方法的共同点:
不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。
两种方法的不同点:
1、继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承
2、继承Thread类必须如果产生Runnable实例对象,就必须产生多个Runnable实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性
基于以上两点所以建议用第二种方法
下面用例子来做说明
程序1:
package com.dr.runnable1; //一个类只要继承了Thread类,则此类就是多线程类 class MyThread extends Thread { private String name; public MyThread(String name) { this.name=name; } //如果要使用多线程,则必须有一个方法的主体 public void run() { //打印输出 for(int i=0;i<10;i++) { System.out.println(this.name+"----->运行、、、、"); } } } public class Demo1 { public static void main(String args[]) { //第一种方法 Runnable r1=new MyThread("线程A"); Runnable r2=new MyThread("线程B"); Runnable r3=new MyThread("线程C"); Thread t1=new Thread(r1); Thread t2=new Thread(r2); Thread t3=new Thread(r3); t1.start(); t2.start(); t3.start(); // mt1.run();//线程执行,使用start方法 // mt2.run(); // mt3.run(); //第二种方法 // MyThread mt1=new MyThread("线程A"); // MyThread mt2=new MyThread("线程B"); // MyThread mt3=new MyThread("线程C"); // mt1.start(); // mt1.start();//线程只能启动一次 // mt2.start(); // mt3.start(); } }
程序的运行结果是:
这是继承了Thread类,第一种方法产生多个Runnable实例对象,然后用Thread产生多个线程
第二种方法,因为这个类已经继承了Thread类,所以就可以直接利用它本身产生多个线程
程序2:
package com.dr.runnable1; class MyThread1 implements Runnable { private int ticket=10; public void run() { for(int i=0;i<500;i++) { if(this.ticket>0) { System.out.println("卖票----->"+(this.ticket--)); } } } } public class Demo2 { public static void main(String args[]) { MyThread1 mt=new MyThread1(); Thread t1=new Thread(mt); Thread t2=new Thread(mt); Thread t3=new Thread(mt); t1.start(); t2.start(); t3.start(); } }
程序运行结果:
这个程序是实现Runnable了,产生一类的实例对象,然后用Thread产生多个线程。
相关文章
spring cloud 的监控turbine-rabbitmq的示例
这篇文章主要介绍了spring cloud 的监控turbine-rabbitmq的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05SpringBoot异常处理器的使用与添加员工功能实现流程介绍
设计完了登录与退出功能还只完成了冰山一角,经过测试发现,我们以url的方式来访问网站时可以直接跳过登陆页面进入后台页面,这样显然是不合理的,下面我们通过异常拦截器+boot来做到访问限制,以及实现新增员工功能,制作全局异常处理器2022-10-10浅析JavaMail发送邮件后再通过JavaMail接收格式问题
这篇文章主要介绍了JavaMail发送邮件后再通过JavaMail接收格式问题 ,本文通过代码实例给大家详细解说,需要的朋友可以参考下2019-06-06java编程FinalReference与Finalizer原理示例详解
这篇文章主要为大家介绍了java编程FinalReference与Finalizer的核心原理以及示例源码的分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助2022-01-01Spring中InitializingBean的使用详细解析
这篇文章主要介绍了Spring中InitializingBean的使用详细解析,InitializingBean是Spring提供的拓展性接口,提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法,需要的朋友可以参考下2024-02-02
最新评论