线程就是为了多任务共同执行存在的,这为软件的多功能提供了便利
线程有生命周期
1,创建
Thread thread=new Thread();
已经给了内存空间
2,就绪
thread.start();
等待cpu调度,还在等cpu的控制权,一旦获得cpu控制权就会执行
默认会执行run(),需要重写这个方法
3,执行
就是执行run()方法,可以被其他的更重要的任务打断
4,阻塞
线程被打断了,阻塞了,需要其他事件才能唤醒
5,销毁
线程终止了,原因可能是自己执行完了,也可能是被其他任务强制结束了,比如软件退出,或者被其他线程杀死
线程之间可以通信:
1,消息Message
描述消息的数据类,常用方法:
Message() | 构造一个对象 |
---|---|
getTarget(Handler) | 获得接收这个消息的对象Handler |
setTarget(Handler) | 设置接收此消息的对象handler |
sendToTarget() | 向Handler发送消息 |
int arg1 | 用于需要存储几个整型数据消息 |
int arg2 | 上同 |
int what | 用于自定义消息标识,避免多线程冲突 |
2.消息处理者Handler
负责多个线程间数据的发送与处理Message
一个线程只能有一个Handler对象,可以给自己所在线程发消息,也可以给其他线程发送消息
Handler() | 构造对象 |
HandleMessage(Message) | 接受消息的子类 |
sendEmptyMessage(int) | 发送空消息 |
sendMessage(Message) | 发送消息 |
sendMessageAtTime(Message,long) | 未来某时间点发送消息 |
sendMessageDelayed(Message,long) | 延时n ms发送消息 |
post(Runable) | 提交计划马上执行 |
postAtTime(Runable,long) | 提交计划未来时间点执行 |
postDelayed(Runable,long) | 提交计划延时n ms执行 |
1,那么如何用他发送消息?
放到线程的run()中
Message msg=new Message(); msg.arg1=2; hander.sendMessage(msg);
2,如何用他接收处理消息?
private class myhander extends Handler { public void handleMessage(Message msg) { switch(msg.arg1) { case 1: {
......
案例:
做一个定时器.每一秒更新一次数据,两个线程
package com.example.mythread;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView showmy1,showmy2;
Button btnstart,btnstop;
boolean Stop=true;
myhander hander;
mythread thread;
mythread2 thread2;
int count1=0;
int count2=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showmy1=(TextView) findViewById(R.id.show_time1);
showmy2=(TextView) findViewById(R.id.show_time2);
btnstart=(Button) findViewById(R.id.button_start);
btnstop=(Button) findViewById(R.id.button_stop);
btnstop.setOnClickListener(new mclick());
btnstart.setOnClickListener(new mclick());
hander =new myhander();
thread=new mythread();thread2=new mythread2();
}
private class mclick implements View.OnClickListener {
@Override
public void onClick(View v) {
if(v==btnstart)
{
Stop=false;
thread.start();
thread2.start();
}
else
{
Stop=true;
}
}
}
private class myhander extends Handler {
public void handleMessage(Message msg)
{
switch(msg.arg1)
{
case 1:
{
count1++;
showmy1.setText(Integer.toString(count1));break;}
case 2:
{
count2++;
showmy2.setText(Integer.toString(count2));break;}
}
}
}
private class mythread extends Thread{
public void run()
{
while(!Stop)
{
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg=new Message();
msg.arg1=1;
hander.sendMessage(msg);
}
}
}
private class mythread2 extends Thread{
public void run()
{
while(!Stop)
{
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg=new Message();
msg.arg1=2;
hander.sendMessage(msg);
}
}
}
}
界面xml文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/show_time1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.224"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.436" />
<Button
android:id="@+id/button_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启线程"
app:layout_constraintBottom_toTopOf="@+id/show_time1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.198"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.49" />
<Button
android:id="@+id/button_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭线程"
app:layout_constraintBottom_toTopOf="@+id/show_time1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.578"
app:layout_constraintStart_toEndOf="@+id/button_start"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.49" />
<TextView
android:id="@+id/show_time2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.775"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_stop"
app:layout_constraintVertical_bias="0.248" />
</androidx.constraintlayout.widget.ConstraintLayout>
如图: