前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程系列(二)-----实现方式

Java多线程系列(二)-----实现方式

作者头像
IT云清
发布2019-01-22 09:32:55
3670
发布2019-01-22 09:32:55
举报
文章被收录于专栏:IT云清IT云清

版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.net/weixin_39800144/article/details/77751864

上一篇讲到了,多线程可以同时执行多个任务,那么,该如何创建线程呢?

通过API中搜索,查到Thread类。通过阅读Thread类中的描述:Thread是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

继续阅读,发现创建新执行线程有两种方式:

1)将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。

2)声明一个实现 Runnable 接口的类。该类实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

好,上代码。

方式一:继承Thread类

步骤:

1 定义一个类继承Thread。

2 重写run方法。run()方法里面就是需要执行的任务。

3 创建子类对象,就是创建线程对象。

4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

---------------------------------------------------------------------------

代码语言:javascript
复制
    public class Test1 {
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start();
        }
    }

----------

    public class MyThread extends Thread{
        @Override
        public void run(){
            for (int i = 0; i < 1000; i++) {
                System.out.println("自定义线程任务在执行"+i);
            }
        }
    }

---------------------------------------------------------------------------

方式二:实现Runnable接口

查阅API可知:Runnable接口用来指定每个线程要执行的任务。

步骤:

1、定义类实现Runnable接口。

2、覆盖接口中的run方法。run()方法里面就是需要执行的任务。

3、创建Thread类的对象

4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程。

--------------------------------------------------------------------------

代码语言:javascript
复制
    public class Test1 {
        public static void main(String[] args) {
            MyRunnable myRun = new MyRunnable();
            Thread thread = new Thread(myRun);
            thread.start();
        }
    }

----------------------

    public class MyRunnable implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                System.out.println("自定义线程任务在执行"+i);
            }
        }
    }

---------------------------------------------------------------------------

上面,我们用代码,初步的了解了怎么样去创建线程,现在,了解一下,这两种方式创建线程的原理,以及优缺点:

问题1:我们为什么要继承Thread类,并调用其的start方法才能开启线程呢?

继承Thread类:因为Thread类用来描述线程,具备线程应该有功能。那为什么不直接创建Thread类的对象呢?如下代码:

--------------------------------------------------------------------------

Thread t1 = new Thread();

t1.start();

--------------------------------------------------------------------------

这样做没有错,但是该start调用的是Thread类中的run方法,而这个run方法没有做什么事情,更重要的是这个run方法中并没有定义我们需要让线程执行的代码。

创建线程的目的是什么?

是为了建立程序单独的执行路径,让多部分代码实现同时执行。也就是说线程创建并执行需要给定线程要执行的任务。

对于之前所讲的主线程,它的任务定义在main函数中。自定义线程需要执行的任务都定义在run方法中。

Thread类run方法中的任务并不是我们所需要的,只有重写这个run方法。既然Thread类已经定义了线程任务的编写位置(run方法),那么只要在编写位置(run方法)中定义任务代码即可。所以进行了重写run方法动作。

问题二:多线程执行时,到底在内存中是如何运行的呢?

多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所属的栈内存空间。进行方法的压栈和弹栈。

当执行线程的任务结束了,线程自动在栈内存中释放了。但是当所有的执行线程都结束了,那么进程就结束了。

问题三:为何要实现Runnable接口,Runable是什么?

查看Runnable接口说明文档:Runnable接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。

继承Thread类和实现Runnable接口有啥区别呢?实现Runnable接口,避免了继承Thread类的单继承局限性。覆盖Runnable接口中的run方法,将线程任务代码定义到run方法中。创建Thread类的对象,只有创建Thread类的对象才可以创建线程。线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。

问题四:实现Runnable的好处

1、实现Runnable接口避免了单继承的局限性,所以较为常用。

2、实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。

3、继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。(面试可能会问)

问题五:线程对象调用 run方法和调用start方法区别?

线程对象调用run方法不开启线程,仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。(面试可能会问)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年08月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档