问题描述
在写一个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线程。