几种创建线程方式Thread类和Runnable接口

对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧.

一.线程的创建方式有三种

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口(返回结果并且可能抛出异常的任务).

如果采用实现Callable接口接口的方式,返回结果并且可能抛出异常的任务,不利于开发,这里就不给大家介绍了.这里咋们主要说说采用继承Thread类和实现Runnable接口的方式来创建线程.

1.继承Thread类的方式

Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。Java中通过继承Thread类来创建启动多线程的步骤如下:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
  2. 创建Thread子类的实例,即创建了线程对象
  3. 调用线程对象的start()方法来启动该线程

代码如下:

测试类:

/*
    1)定义类继承Thread,重写run方法
    2)创建线程对象
    3)进行调用线程的start方法进行开启线程

 */
public class Demo01 {
    public static void main(String[] args) {

        MyThread m = new MyThread();
        m.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("小强:" + i);
        }

    }
}

创建类来实现Thread

public class MyThread extends Thread {
    @Override
    public void run() {
        //多线程处理的任务
        for (int i = 0; i < 100; i++) {
            System.out.println("旺财:" + i);
        }
    }
}

看了上面的代码,你可能会问,线程对象是如何创建的,线程里面有哪些方法呢?下面就来说说怎么创建线程对象.

通过查看API我们看到了lang包下的Thread类,是非抽象的,还有构造方法,那是不是就是可以直接用Thread类的构造方法来创建对象呢?答案是:不可以!!!

记住:

Thread类的构造方法不是为创建线程而定的,是给子类使用的!!!

线程常用的方法:
1. public String getName():获取当前线程名称。
2. public void start():导致此线程开始执行; Java虚拟机调用此线程的run方法。
3. public void run():此线程要执行的任务在此处定义代码。
4. public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
5. public static Thread currentThread():返回对当前正在执行的线程对象的引用。

线程的执行步骤:线程执行,开启了线程,JVM调用其run方法来执行任务。

public class MyThread2 extends Thread {
    public MyThread2(){
        super(); // public Thread()
    }

    public MyThread2(String name) {
        super(name);/// public Thread(String name)
    }

    @Override
    public void run() {
        //如果没有给线程起名:默认 Thread-x
        String name = getName(); //获取线程的名字
        System.out.println(name +"线程执行起来");
    }
}

测试类

public class Demo02 {
    public static void main(String[] args) {
        //Thread直接创建对象,Thread(),Thread(String name)
        Thread mt1 = new Thread();
        mt1.start();

        MyThread2 mt2 = new MyThread2();
        mt2.start();

        MyThread2 mt3 = new MyThread2("小强");
        mt3.start();

        //public static Thread currentThread():返回当前方法运行的线程对象
        Thread thread = Thread.currentThread();
        String name = thread.getName();
        System.out.println("main方法执行的线程名字: " + name);

        //public static void sleep(long mills)
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

Thread类API查询:

2.实现Runnable接口

首先我们来看看API是怎么说的

由API中的介绍,我们采用java.lang.Runnable也是非常常见的一种,我们不用继承Thread类,只需要重写run方法即可。

  1. public Thread(Runnable target):分配一个带有指定目标新的线程对象。
  2. public Thread(Runnable target,String name):分配一个带有指定目标新的线程对象并指定名字。

一般使用步骤:
1)先创建任务【Runnable的对象】
2)借助含有Runnable参数的Thread构造方法,进行创建线程
3)调用线程的start方法开启线程

public class Demo01 {
    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();
        //1. public Thread(Runnable target):分配一个带有指定目标新的线程对象。
        Thread mth1 = new Thread(runnable);
        mth1.start();

        //2. public Thread(Runnable target,String name):分配一个带有指定目标新的线程对象并指定名字。

        Thread mth2 = new Thread(runnable, "旺财");
        mth2.start();

        //3. 匿名内部类实现
        Runnable target = new Runnable() {
            @Override
            public void run() {
                Thread thread = Thread.currentThread();
                String name = thread.getName();

                System.out.println(name+"线程执行run方法【匿名内部类实现】");
            }
        };

        new Thread(target).start();
        new Thread(target,"旺财").start();

    }
}

通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个执行目标。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。

在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

小结

多线程代码都是通过调用Thread的start()方法来运行的。因此,不管是继承Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程执行体。而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run()方法。

3.Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

总结:

实现Runnable接口比继承Thread类所具有的优势:

  1. 适合多个相同的程序代码的线程去共享同一个资源。
  2. 可以避免java中的单继承的局限性。
  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  4. 线程池只能放入实现Runnable或Callable类线程,不能直接放入继承Thread的类。

扩充:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进程。

原文地址:https://www.cnblogs.com/shadowlovesunshine/p/10851789.html

时间: 2024-10-06 20:33:34

几种创建线程方式Thread类和Runnable接口的相关文章

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

多线程-----Thread类与Runnable接口的区别

第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMyThread的时候在创建三个对象的同时创建了三个线程:实现Runnable的, 相当于是拿出一个卖早餐10份的任务给三个人去共同完成,newMyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行. 一个类只能继承一个父类,存在局限:一个类可以实现多个接口.在

Java多线程和并发(三),Thread类和Runnable接口

目录 1.Thread和Runnable接口 三.Thread类和Runnable接口 1.Thread和Runnable接口 原文地址:https://www.cnblogs.com/xzmxddx/p/10362804.html

Thread类,Runnable 接口

Thread类 Thread是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 创建新执行线程的两种方法: 一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.创建对象,开启线程.run方法相当于其他线程的main方法. 另一种方法是声明一个实现 Runnable 接口的类.该类然后实现 run 方法.然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程. 继承Thread类 创建线程: 定义一个类继承Thread

7种创建线程方式,你知道几种?线程系列Thread(一)

前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对这方面还比较薄弱,这个时候就得好好补补了,这样才能加快提升自身能力的步伐,接下来的时间会着重讲解线程方面的知识.强势分割线. 话题乱入,一到跳槽季节想必我们很多人就开始刷面试题,这种情况下大部分都能解决问题,但是这样的结果则是导致有可能企业招到并非合适的人,当然作为面试官的那些人们也懒得再去自己出一

详解~实现Runnable方法创建线程之为什么要将Runnable接口的子类对象传递给Thread的构造函数

/** * @author zhao * @TIME 0419 22:56  End *定义线程的第二种方法:实现Runnable接口 *步骤:1,定义一个子类实现Runnable接口 *    2,在子类中覆盖run()方法,并且将多线程锁执行的代码写入run方法中 *    3,通过Thread类建立线程对象: *    4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数.  为什么要将Runnable接口的子类对象传递给Thread的构造函数.  因为,自定义的

Java 多线程之 Thread 类 和 Runnable 接口初步使用

Thread 类 Thread 类是在 JDK1.0 时就存在的, 在 Java 中接触的多线程开发基本上都会从这个类开始. Thread之定义线程类 使用 Thread 创建线程的方法很简单, Thread 是一个类, 在需要创建线程时, 我们只需要继承这个类, 并将 run() 方法进行重写即可. class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = min

创建多线程方式二:实现Runnable接口

1.创建一个实现了Runnable接口的类 2.实现类去实现Runnable中的抽象方法:run() 3.创建实现类的对象 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象 通过Thead类的对象调用start方法 比较创建线程的两种方式: 开发中:优先选择实现Runnable接口的方式 1.实现的方式没有类的单继承性的局限性 2.实现的方式更适合处理多个线程有共享数据的情况 联系:public  class Thread implements Runnable 相同

Thread类和Runnable接口实现多线程--2019-4-18

1.通过Thread实现 public class TestThread extends Thread{ public TestThread(String name) { super(name); } public void run() { for(int i = 0;i<5;i++){ for(long k= 0; k <100000000;k++); System.out.println(this.getName()+" :"+i); } } public static