文档章节

java线程的实现方式

rainmanqqst
 rainmanqqst
发布于 2017/02/16 18:45
字数 940
阅读 25
收藏 1

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对象,使用的是这个对象的内存空间,所以任意一方的修改,就会导致其他线程也发生更改。

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

© 著作权归作者所有

rainmanqqst
粉丝 8
博文 65
码字总数 37021
作品 0
浦东
程序员
私信 提问
JAVA线程8 - ThreadLocal

一、ThreadLocal简介 ThreadLocal并不是一个Thread,而是Thread的局部变量。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立...

小米米儿小
2014/02/26
704
0
java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机
2018/05/16
0
0
从Java到JVM到OS线程睡眠

前言 Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么。 简单例子 以下是一个简单的例子,使主线程睡眠5秒钟。 JVM ...

超人汪小建
2018/08/20
0
0
Java多线程下 ThreadLocal 的应用实例

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。...

空云万里晴
2014/01/06
1K
0
java.lang.ThreadLocal类研究

java.lang.ThreadLocal类研究 1、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为...

SDK4
2011/09/17
383
2

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部