博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程的实现方式
阅读量:6334 次
发布时间:2019-06-22

本文共 2663 字,大约阅读时间需要 8 分钟。

hot3.png

java有两种实现线程的方式,一种是通过继承Thread类,一种是通过实现Runnable接口。

通过Thread实现代码

public class A extends Thread{        @Override    public void run(){        System.out.println("hello world");    }}

通过Runnable实现代码

public class B implements Runnable{        @Override    public void run(){        System.out.println("hello world");    }}

相对于Thread类实现,Runnable接口实现有更好的扩张性,更加推荐使用。在java中每个类都只能有一个父类,但是却可以有很多个接口。对于一个类来说,如果选择以继承Thread方式实现线程的话,该类就不能继承其他类的,这样就使得这个类失去了通过继承获取其他类功能的能力,除非他继承的父类已经继承了Thread类(但是,可能增加了项目的复杂度,形成多级继承的架构)。如果选择Runnable接口的话,就没有那么多烦恼了,只是令某个类增加了线程的功能而已,对这个类的其他功能,以及类之间的关系都不会造成影响。稍微形象些,用游戏比较的话,选择继承Thread相当于选择了种族,选择Runnable接口则相当于拿了一件装备,所以明显是继承的影响比较大,使用Runnable接口比较靠谱。

上网查资料时,在部分文章里面提出Runnable可以实现“资源共享”,而Thread则不行。但是实际操作后,发现这是错误的。Thread类型也是继承了Runnable方法,所以也可以实现资源共享。

验证代码如下:

Runnable接口实现

public class ThreadTester {    public static void main(String[] args){        ThreadA a1 = new ThreadA();        new Thread(a1,"接口实现——甲").start();        new Thread(a1,"接口实现——乙").start();        new Thread(a1,"接口实现——丙").start();    }}class ThreadA implements Runnable{    int i=0;    @Override    public void run(){        for(;i<10;) {            System.out.println(Thread.currentThread().getName()+" Thread is running , i is "+i++);        }    }}

运行结果为:

接口实现——甲 Thread is running , i is 0接口实现——丙 Thread is running , i is 2接口实现——乙 Thread is running , i is 1接口实现——乙 Thread is running , i is 5接口实现——乙 Thread is running , i is 6接口实现——乙 Thread is running , i is 7接口实现——乙 Thread is running , i is 8接口实现——乙 Thread is running , i is 9接口实现——丙 Thread is running , i is 4接口实现——甲 Thread is running , i is 3

Thread继承实现

public class ThreadTester {    public static void main(String[] args){                ThreadB b1 = new ThreadB();        new Thread(b1,"类继承实现——甲").start();        new Thread(b1,"类继承实现——乙").start();        new Thread(b1,"类继承实现——丙").start();    }}class ThreadB extends Thread{    int i=0;    @Override    public void run(){        for(;i<10;) {            System.out.println(Thread.currentThread().getName()+" Thread is running , i is "+i++);        }    }}

运行结果为:

类继承实现——甲 Thread is running , i is 0类继承实现——甲 Thread is running , i is 2类继承实现——甲 Thread is running , i is 3类继承实现——甲 Thread is running , i is 4类继承实现——乙 Thread is running , i is 1类继承实现——乙 Thread is running , i is 7类继承实现——乙 Thread is running , i is 8类继承实现——甲 Thread is running , i is 6类继承实现——丙 Thread is running , i is 5类继承实现——乙 Thread is running , i is 9

================================

Runnable 实现资源共享的原理其实也比较简单,在以上的代码中,系统声明了一个Thread对象,并将这个对象作为一个参数传递给三个线程,然后启动。在这个过程中三个线程实际引用了一开始声明的Thread对象,使用的是这个对象的内存空间,所以任意一方的修改,就会导致其他线程也发生更改。

所以能不能资源共享,就是看是不是声明的对个对象,开辟了不同的内存空间

转载于:https://my.oschina.net/u/241670/blog/840343

你可能感兴趣的文章
Atitit 记录方法调用参数上下文arguments
查看>>
webstorm常用功能FTP,及常用快捷键
查看>>
eclipse html 打开方式
查看>>
[求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
查看>>
人类投资经理再也无法击败电脑的时代终将到来了...
查看>>
一个最小手势库的实现
查看>>
HoloLens开发手记 - Vuforia开发概述 Vuforia development overview
查看>>
Android支付之支付宝封装类
查看>>
<亲测>CentOS中yum安装ffmpeg
查看>>
【分享】马化腾:产品设计与用户体验
查看>>
【机器学习PAI实践十】深度学习Caffe框架实现图像分类的模型训练
查看>>
全智慧的网络:思科十年来最具颠覆性的创新
查看>>
怎样将现有应用迁移到 VMware NSX
查看>>
赛门铁克收购以色列移动安全初创公司Skycure 旨在构建网络安全防御平台
查看>>
《Photoshop蒙版与合成(第2版)》目录—导读
查看>>
《团队软件过程(修订版)》—第1章1.3节TSPi的设计
查看>>
“最佳人气奖”出炉!4月27号,谁能拿到阿里聚安全算法挑战赛的桂冠?
查看>>
《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——2.6 图层与图层样式...
查看>>
《iOS组件与框架——iOS SDK高级特性剖析》——第2章,第2.7节获取线路
查看>>
Spring中 @Autowired标签与 @Resource标签 的区别
查看>>