美文网首页
有关线程的问题

有关线程的问题

作者: zgfei | 来源:发表于2017-09-27 10:59 被阅读5次

    问题描述

    在写一个demo时需要使用线程来模拟网络请求的方式,结果在下拉刷新的时候进度条显示但是不旋转。

    使用线程的方式是:

    //导致进度条显示但是不旋转
      new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).run();
    

    修改后为:

    //正常
    new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    

    于是产生疑问,两者之间的区别是什么?

    解答

    首先线程有两种方式实现,一种通过Thread,另一种是通过实现Runnable接口,两者在实现上和作用上均有区别。

    Thread

    实现方式:

    //通过继承方式
    public class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
    }
    }
    //调用
    MyThread thread = new MyThread();
    thread.start();
    

    可以看出这种方式,只能单继承,因此有一定的局限性。

    Runnable

    //通过实现的方式
    public class MyRunnable implements Runnable {
    @Override
    public void run() {
    }
    }
    //调用
    Thread thread1 = new Thread(new MyRunnable());
    thread1.start();
    

    可以看到实现Runnable也是通过Thread来调用的。
    如果多个Thread也是同时调用的同一个Runnable对象,因此在Runnable里面实现的run方法中处理的数据可以共享到每个Thread中。因为使用的是实现的方式,因此避免了单继承的局限性。

    问题分析

    结果发现上面一个Thread调用的是run方法,进行执行,这是问题的关键。(开始看错,以为是Thread()和Thread(Runnable)的区别导致的)

    run()和start()运行的区别

    调用run方法,相当于直接运行run方法内的代码在同一个线程中运行,并不会开启新的线程运行。
    因为我是在Main线程中调用的run方法,因此相当于让Main线程sleep一秒后运行,导致进度条没有旋转。

    调用start方法,系统会开启一个新线程执行run方法里面的代码。因此不会阻塞Main线程。

    相关文章

      网友评论

          本文标题:有关线程的问题

          本文链接:https://www.haomeiwen.com/subject/rbwyextx.html