Java中Thread和Runnable创建线程的方式对比

目录
  • 一、通过继承Thread创建线程
  • 二、实现Runnable创建检查
  • 三、比较两种创建方式
    • 3.1、多继承
    • 3.2、 数据共享
    • 3.3、线程池
  • 四、源码分析

一、通过继承Thread创建线程

通过继承Thread类,创建一个线程,在主线程中,调用start,让线程处于runnable状态,让系统去运行线程的方法。

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("执行线程");
    }
}
public class ThreadTest {

    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
    }
}

二、实现Runnable创建检查

通过实现runnable接口,创建一个线程,需要把runnable的实现类,作为Thread的构造方法的参数,运行这个线程。

public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("执行线程");
    }
}

public class ThreadTest {
    public static void main(String[] args) {
        Runnable thread = new MyThread();
        Thread thread1 = new Thread(thread);
        thread1.start();

    }
}

这里要注意一些,runnable的实现类,是没有start()方法的,只有run()方法

如果运行这个run方法,依然能运行线程的方法,但是,这个方法并不是在新的线程中运行的,而是在主线程中运行的。

public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("此方法在:"+Thread.currentThread().getName()+"中运行");
    }
}

public class ThreadTest {

    public static void main(String[] args) {
        Runnable run = new MyThread();
        System.out.println("此方法在:"+Thread.currentThread().getName()+"中执行");
        run.run();
//        Thread thread1 = new Thread(run);
//        thread1.start();

    }
}

运行结果:

如果把注释打开,run()注释掉,结果如下:

三、比较两种创建方式

3.1、多继承

Java是不支持类的多继承的,但是支持接口的多实现,所以Runnable在使用上更加灵活。

3.2、 数据共享

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
如果线程中有一个成员变量,使用Runnable创建的线程,多个线程之间可以共同访问这个变量,而Thread不可以。

为什么呢?一个Thread创建的线程,每次都是new的一个新的线程对象,线程对象之间的成员变量不共享。而Runnale,可以作为Thread类的参数,可以多创建几个Thread类,把Runnale作为参数,让多个线程一起运行。

public class ThreadTest {

    public static void main(String[] args) {
        Runnable run = new MyThread();
        Thread thread1 = new Thread(run);
        Thread thread2 = new Thread(run);
        Thread thread3 = new Thread(run);
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

3.3、线程池

线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类。

四、源码分析

当我们进入Thread方法,可以看的Thread也实现了Runnable接口

使用Thread肯定也实现了他的run方法。

可以看出,在这个run方法中,如果target不为空,执行target的run方法,那target是什么?

进入后,发现是runnable接口,那它是如何初始化的?突然想起,执行runnable的实现类时,都会把他通过构造函数传递,那来看看构造函数。

继续往下,可以看出确实是在这里初始化的。

所以,Runnbale接口的run方法,是通过Thread的成员变量去执行的。

到此这篇关于Java中Thread和Runnable创建线程的方式对比的文章就介绍到这了,更多相关Java中Thread和Runnable创建线程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java多线程编程之使用thread类创建线程

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( );public Thread(Runnable target);public Thread(String name);public Thread(Ru

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

    本文实例讲述了Java继承Thread类创建线程类.分享给大家供大家参考,具体如下: 一 点睛 通过继承Thread类创建线程并启动多线程的步骤: 1 定义Thread的子类,并重写该类的run()方法,该run()方法的方法体代表了线程需要完成的任务.因此run()方法称为线程执行体. 2 创建Thread子类的实例,即创建子线程对象. 3 调用线程对象的start()方法来启动该线程. 二 代码 // 通过继承Thread类来创建线程类 public class FirstThread ex

  • Java创建线程池为什么一定要用ThreadPoolExecutor

    目录 先说结论 OOM风险演示 内存溢出原因分析 使用ThreadPoolExecutor来改进 其他创建线程池的问题 总结 前言: 在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类来说,线程池的创建总共分为两大类:手动方式使用ThreadPoolExecutor创建线程池和使用 Executors 执行器自动创建线程池. 那究竟要使用哪种方式来创建线程池呢?我们今天就来详细的聊一聊. 先说结论 在 Java 语言中,一定要使用 ThreadPoolE

  • java线程之用Thread类创建线程的方法

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread

  • java Runnable接口创建线程

    java Runnable接口创建线程 创建一个线程,最简单的方法是创建一个实现Runnable接口的类. 为了实现Runnable,一个类只需要执行一个方法调用run(),声明如下: public void run() 你可以重写该方法,重要的是理解的run()可以调用其他方法,使用其他类,并声明变量,就像主线程一样. 在创建一个实现Runnable接口的类之后,你可以在类中实例化一个线程对象. Thread定义了几个构造方法,下面的这个是我们经常使用的: Thread(Runnable th

  • java多线程编程之使用runnable接口创建线程

    1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法. 最后通过Thread类的start方法建立线程.下面的代码演示了如何使用Runnable接口来创建线程: package mythread;public class MyRunnable implements Runnable{ public void run() {  System.out.println(Thread.currentThread().get

  • java线程之使用Runnable接口创建线程的方法

    实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1. 将实现Runnable接口的类实例化. 2. 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法. 最后通过Thread类的start方法建立线程. 下面的代码演示了如何使用Runnable接口来创建线程: 复制代码 代码如下: package mythread; public class MyRunnable implements Runn

  • Java中Thread和Runnable创建线程的方式对比

    目录 一.通过继承Thread创建线程 二.实现Runnable创建检查 三.比较两种创建方式 3.1.多继承 3.2. 数据共享 3.3.线程池 四.源码分析 一.通过继承Thread创建线程 通过继承Thread类,创建一个线程,在主线程中,调用start,让线程处于runnable状态,让系统去运行线程的方法. public class MyThread extends Thread { @Override public void run() { System.out.println("执

  • 详解Java中Thread 和Runnable区别

    Thread 和Runnable 关系 Thread类是接口Runnable的一个实现类. public class Thread implements Runnable 源码分析 Thread Threa类运行的时候调用start()方法,源代码如下: 调用start()方法,实际运行的是start0方法,方法声明如下: private native void start0() native表明这个方法是个原生函数,即这个函数是用C/C++实现的,被编译成DLL,由Java调用. native

  • Java使用Thread和Runnable的线程实现方法比较

    本文实例讲述了Java使用Thread和Runnable的线程实现方法.分享给大家供大家参考,具体如下: 一 使用Thread实现多线程模拟铁路售票系统 1 代码 public class ThreadDemo { public static void main( String[] args ) { TestThread newTh = new TestThread( ); // 一个线程对象只能启动一次 newTh.start( ); newTh.start( ); newTh.start(

  • JAVA多线程Thread和Runnable的实现

    java中只允许单一继承,但允许实现多个接口,因此第二种方法更灵活. 复制代码 代码如下: /**     * 运行继承java.lang.Thread类定义的线程     */    public void startOne() {        // 创建实例        OneThread oneThread = new OneThread();        // 启动线程ThreadA        oneThread.startThreadA();        try {    

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

    本文实例讲述了Java使用Callable和Future创建线程操作.分享给大家供大家参考,具体如下: 一 点睛 从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大. call()方法可以有返回值. call()方法可以声明抛出异常. 创建并启动线程的步骤如下: 1 创建Callable接口的实现类,并实现call()方法,该call()方法

  • Java中Thread.join()的使用方法

    概要 本文分三个部分对Thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示例和作用 1.1 示例 // 父线程 public class Parent { public static void main(String[] args) { // 创建child对象,此时child表示的线程处于NEW状态 Child child = new Child(); // child

  • java中常见的6种线程池示例详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如下 线程池名称 描述 FixedThreadPool 核心线程数与最大线程数相同 SingleThreadExecutor 一个线程的线程池 CachedThreadPool 核心线程为0,最大线程数为Integer. MAX_VALUE ScheduledThreadPool 指定核心线程数的定时

  • Java中Thread类的使用和它的属性

    目录 创建线程 方法一:继承Thread类 方法二:实现Runnable接口中的run()方法 方法三:利用内部类 方法四:使用lambmd表达式 使用线程的好处 Thread类的其他属性和方法 给一个线程起名字 判断一个线程是否存活 Thread的其他常见属性 创建线程 线程的中断 线程的等待 获取线程的引用 线程的休眠 在java中可以进行多线程编程,在java标准库中提供了一个Thread类,来表示线程操作.Thread类可以视为java标准库提供的一组解决多线程编程的一组API. 创建好

  • Java中Thread类详解及常用的方法

    目录 一.Thread 的常见构造方法 二.Thread 的常见属性 三.创建线程 四.中断线程 五.线程等待 六.获取线程引用 七.线程休眠 八.线程状态 总结 一.Thread 的常见构造方法 方法 说明 Thread() 创建线程对象 Thread(Runnable target) 使用 Runnable 对象创建线程对象 Thread(String name) 创建线程对象并命名 Thread(Runnable target,String name) 使用 Runnable 对象创建线程

  • Java创建线程的方式解析

    目录 继承Thread,这里使用匿名内部类 实现Runnable接口,配合Thread类,同样用匿名内部类 FutureTask配合Thread 继承Thread,这里使用匿名内部类 @Slf4j(topic = "c.Test1") public class Test1 { public static void main(String[] args) { //创建线程对象 Thread t = new Thread(){ @Override public void run() { /

随机推荐