版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
、线程JAVA中的线程线程的概念线程是程序运行的基本执行单元。当操作系统在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。因此,在操作系统中运行的任何程序都至少有一个主线程。实现线程的方法在Java中建立线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口,其实这两种方法从本质上说是一种方法,即都是通过Thread类来建立线程,并运行run方法的。1.3线程的生命周期线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。MainThread与WorkerThreadMainThread是主线程,又叫UI线程,WorkerThread是除了主线程之外的其他线程。原则上来讲,worderthread里不允许操作UI。只有主线程mainthread可以。我们新建一个项目,在MainActivity里设置一个Button,点击它时启动一个线程。publicclassMainActivityextendsActivity{privateTextviewtextview;privateButtonbutton;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=(TextView)findViewById(R.id.textview);button=(Button)findViewById(R.id.button);button.setonClickListener(newlistener());}classlistenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){Threadt=newthread();t.start();}}//workerthreadclassthreadextendsThread{publicvoidrun(){try{Thread.sleep(1*1000);//阻塞当前线程指定的时间}catch(InterruptedExceptione){e.printStackTrace();}textView.setText("来自于线程的修改");}}}上面是已经写好的代码,我们在监听器里实例化了一个自定义的Thread,调用了它的start方法。我们在thread类的run方法里修改了textview的文本,即操作了UI。这个项目在运行后,点击按钮,出现了如下错误:这就是因为在worderthread里操作了UI。但是有一些特殊的控件是允许的,比如progressBar。但如果把所有事情放在主线程里做,非常容易出现AR错误,就是“应用程序没有响应”。比如,我们把监听器里的代码改成classlistenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){try{Thread.sleep(10*1000);//让主线程休眠十秒}catch(InterruptedExceptione){e.printStackTrace();}我们点击按钮,它接近于死机状态,过个几秒,会出现如下画面:S02E02_Thread01isn'tresponding.Doyouwanttocloseit?Wait OK这是因为主线程阻塞了。结论:mainthread与worderthread各有所职。主线程主要用于接收用户的输入,以及将运算结果反馈给用户。主线程不允许阻塞,不要进行耗时较长的操作,如访问网络,大量读写等。这些操作必须放在worderthread中。mainthread负责Ul,worderthread负责运算。提问:那么,worderthread中返回的信息如何影响UI呢?如何与mainthread通信呢?这需要用到handler。二、Handler1.运行基本原理Handler、Looper和MessageQueue三者构成了android的消息机制。看下图:MessageQueue是一种数据结构,符合先进先出的原则,类似一个隧道。MessageQueue可以存放多个消息对象。Handler负责将消息对象加入到MessageQueue。Looper是一个循环器,不停的从MessageQueue中取出消息对象。如果MessageQueue中没有消息对象,Looper会处于等待状态。Looper将消息对象从MessageQueue中取出,再交给Handler处理。2.一个简单的例子我们建立一个简单的handler例子:新建一个项目,mainActivity里加一个button,设置监听器。接下来,我们定义一个handler,它需要继承Handler。曲EY--tV%.注意:在引入包的时候,要选择android.os.Handler。弹门cdroiij/OsH日nclle■”"0^java.util.logging.Handler然后,我们要复写一个方法,是handleMessage方法。菜单栏Source->Override/ImplementMethodsSeiectmffthodstooverride-orimplement:J□gHandlerdi^pstchMessagetMessa-g-e)getMessageNameflMessage)handleWessagefMessage)I|QsendMestageAtTime(Menage,long)□etcrStringOD-鬥OObject然后我们声明一handler对象privateHandlerhandler;在oncreate里给它赋值handler=newhandler();当用户点击按钮时,我们创建一个消息对象,并使用handler发送该对象。监听器里代码如下:classlistenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){Messagemsg=handler.obtainMessage();//获取一个消息对象msg.what=2;//给message的一个属性赋值handler.sendMessage(msg);//用handler发送这个对象至Umessagequeue中去}}一旦messagequeue里有消息对象了,looper立刻将消息对象取出,找到与消息对象对应的handler,然后调用handler对象的handlerMessage方法,处理消息对象。这时,我们回到自定义的handler的handlerMessage方法,填充代码:classhandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){intwhat=msg.what;System.out.println(what);}}三、通过Handler实现线程间的通信l.workerthread向mainthread发送消息前面的例子是把handler放在主线程中运行。现在做另外一个例子,在主线程中实现Handler的handleMessage方法,在workerthread中通过handler发送消息。还是新建一个项目,放一个按钮和文本,点击按钮后启动一个线程,让这个线程休眠两秒之后把文本的内容修改掉。这个例子的实际意义在于,把休眠替换成访问服务器就是开发中经常用到的例子。准备好按钮和文本控件,我们来定义一个线程,在run函数里模拟了一次访问服务器和取值://workerthreadclassthreadextendsThread{@Overridepublicvoidrun(){try{Thread.sleep(2*1000);//模拟访问网络,休眠两秒钟}catch(InterruptedExceptione){e.printStackTrace();}Strings="从网络中获取的数据”;//模拟服务器的返回值}}然后在button的监听器里启动这个线程。classlistenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewv){Threadt=newthread();t.start();}}重点来了,刚才我们定义的Thread是WorkerThread,它不能直接操作textview。我们需要Handler。先把它定义出来,先放着:classhandlerextendsHandler{@Override//workerthreadclassthreadextendsThread{@Overridepublicvoidrun(){//System.out.println("workerthread:"+Thread.currentThread().getName());//打印当前线程的名字try{Thread.sleep(2*1000);//模拟访问网络,休眠两秒钟}catch(InterruptedExceptione){e.printStackTrace();}Strings="从网络中获取的数据”;//模拟服务器的返回值Messagemsg=handler.obtainMessage();msg.obj=s;handler.sendMessage(msg);}}发送消息完成,接下来就是处理消息,我们回到自定义的handler,接收S,并写入textview的文本:classhandlerextendsHandler{ OverridepublicvoidhandleMessage(Messagemsg){//System.out.println("handleMessage:"+Thread.currentThread().getName());//打印当前线程的名字Strings=(String)msg.obj;textView.setText(s);}}这样,我们实现了workerthread向mainthread发送消息。访问网络都是这样操作的。2.mainthread向workerthread发送消息与前一个例子不同的是,我们需要在workerthread中准备一个looper对象,并把handler定义在workerthread中。首先还是新建一个项目,准备一个Button。然后定义一个线程://workerthreadclassthreadextendsThread{@Overridepublicvoidrun(){//准备Looper对象Looper.prepare();//在workerthread中定义一个handler(匿名内部类)handler=newHandler(){ verridepublicvoidhandleMessage(Messagemsg){}};//让Looper开始循环,不断的从消息队列中取出消息对象,如果没有消息对象,则该线程阻塞。Looper.loop();}}这个线程有点复杂,首先是准备一个Looper对象,然后用匿名内部类的方式定义一个handler,为什么?因为handleMessage方法是定义在接收消息的一方。我们这个例子是要workerthread接收并处理消息。先把handleMessage的内容空着,接下来,让Looper开始循环,它会不断的从消息队列中取出消息对象。接下来,我们在主线程里让workerthread启动:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);butt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年铁道党校招聘普通高校毕业生11人笔试历年参考题库附带答案详解
- 2025年辽宁沈阳地铁集团有限公司运营分公司招聘259人笔试历年参考题库附带答案详解
- 2025年罗田县经发融资担保有限公司公开招聘2人笔试历年参考题库附带答案详解
- 2025年福建广电网络集团三明分公司社会招聘笔试历年参考题库附带答案详解
- 2025年滁州东源电力工程有限公司注册类人员招聘11人笔试历年参考题库附带答案详解
- 2025年湖北交通投资集团有限公司春季校园招聘笔试历年参考题库附带答案详解
- 2025年浙江省交通投资集团财务共享服务中心招聘2名笔试历年参考题库附带答案详解
- 2025年河南洛阳市老城区招聘55人笔试历年参考题库附带答案详解
- 2025年江苏省粮食集团有限责任公司春季公开招聘7人(第一批)笔试历年参考题库附带答案详解
- 2025年杭州淳安县交通发展投资集团有限公司招聘2名笔试历年参考题库附带答案详解
- GB 21256-2025粗钢生产主要工序单位产品能源消耗限额
- 家畜繁殖员技能测试题库及答案
- DB3305∕T 309-2024 现代小区治理与服务规范
- 建筑给排水及采暖工程质量验收标准
- 业务推广及推广费结算协议
- 拆除钢架棚安全协议书
- 2025年国家公务员考录《申论》真题及参考答案(行政执法卷)
- 甘肃2025年甘肃省农业科学院招聘14人笔试历年参考题库附带答案详解
- 2023农药经营人员上岗证考核试题及答案
- T-CCMA 0055-2017 工程机械液压管路布局规范
- 消化道出血介入栓塞治疗
评论
0/150
提交评论