1 继承Thread类多线程
2 实现Runnable接口大数据
二者区别:线程
前者表明一个线程code
后者表明线程体,也就是线程要执行的代码。继承
多线程同步接口
多个线程同时访问一个资源,为了不出现错误,就要实现线程同步。 让这个资源一次只能被一个线程访问。图片
MainThread=主线程=UI线程资源
除此以外的线程叫WorkerThread同步
全部UI由主线程操做it
可能产生阻塞的操做放在Worker Thread中操做
大多数状况下WorkerThread不能操做UI
在安卓中,本身建立出来的线程都叫WorkerThread,因此,除此以外,咱们全部的操做都是在MainThread中进行的。
下面这个实验用来证实WorkerThread中不能操做UI:
具体的实现是:
点击按钮,启动一个线程; 在这个线程中,将试图修改文本域的内容;
线程内部类: 修改文本域内容
class MyThread extends Thread { public void run(){ try { Thread.sleep(2 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } textView_1.setText("OK"); } }
按钮监听器类: 建立启动WorkerThread线程
class ButtonListener implements OnClickListener { public void onClick(View v) { new MyThread().start(); } }
点击按钮的结果: 提示只有在拥有建立View权限的原始线程(主线程)中才能操做View。
但一些特殊的组件能够在WorkerThread中被操做,如: · progressbar的setProgress方法
Worker Thread虽然不能操做UI,可是它有其余做用:
处理那些可能引起阻塞的操做,如大数据处理。
由于,若是这些可能引起阻塞的操做若是在主线程中处理的话,就可能会引起ANR问题。
下面经过一个例子再现这个ANR问题。
例子实现的是:
在主线程中,点击按钮,直接休眠10秒,期间频繁点击屏幕,就会出现ANR提示框。
按钮监听器类:
class ButtonListener implements OnClickListener { public void onClick(View v) { try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
点击按钮,屏幕卡住,再点几下屏幕,10秒后: