有关线程的问题

2017-09-27  本文已影响5人  zgfei

问题描述

在写一个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线程。

上一篇下一篇

猜你喜欢

热点阅读