android线程

线程就是为了多任务共同执行存在的,这为软件的多功能提供了便利

线程有生命周期

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>

如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值