有关线程的问题

问题描述

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,517评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,008评论 1 18
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,395评论 3 87
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 微信订阅号和服务号的区别? 推送频率 订阅号:每‘天’可推送1条消息 服务号:每‘月’能推送4条消息 自定义功能 ...
    代码界的泥石流阅读 2,736评论 0 2