Android系统-线程-java线程

这篇具有很好参考价值的文章主要介绍了Android系统-线程-java线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

Android的框架应用是java环境的。java天生就是多线程。所以对java线程的理解尤为重要。

概念

线程状态转换图

Android系统-线程-java线程,Android系统开发,android,java,开发语言

NEW 初始状态

RUNNABLE 运行状态

BLOCKED 阻塞状态

WAITING 等待状态

TIME_WAITING 超时等待状态

TERMINATED 终止状态

注意:调用obj.wait()的线程需要先获取obj的monitor,wait()会释放obj的monitor并进入等待态。所以wait()/notify()都要与synchronized联用。

阻塞与等待的区别

阻塞:当一个线程试图获取对象锁(非java.util.concurrent库中的锁,即synchronized),而该锁被其他线程持有,则该线程进入阻塞状态。就是说阻塞是一个线程因为等待临界区的锁被阻塞产生的状态。

它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要由另一个线程来显式唤醒自己,不响应中断。

等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。

它的特点是需要等待另一个线程显式地唤醒自己,实现灵活,语义更丰富,可响应中断。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。等待 一个线程进入了锁,但是需要等待其他线程执行某些操作

主要方法

start()

新启一个线程执行其run()方法,一个线程只能start一次。主要是通过调用native start0()来实现。

public synchronized void start() {
//判断是否首次启动
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        group.add(this);

        boolean started = false;
        try {
//启动线程
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

    private native void start0();

run()

run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当该线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。

sleep()

sleep方法有两个重载版本

sleep(long millis)     //参数为毫秒

sleep(long millis,int nanoseconds)    //第一参数为毫秒,第二个参数为纳秒

sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。

但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。

yield():调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。

注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

join()

join方法有三个重载版本
 

join()
join(long millis)     //参数为毫秒
join(long millis,int nanoseconds)    //第一参数为毫秒,第二个参数为纳秒

join()实际是利用了wait(),只不过它不用等待notify()/notifyAll(),且不受其影响。它结束的条件是:1)等待时间到;2)目标线程已经run完(通过isAlive()来判断)。

public final synchronized void join(long millis) throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    //0则需要一直等到目标线程run完
    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
        //如果目标线程未run完且阻塞时间未到,那么调用线程会一直等待。
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

interrupt()

此操作会将线程的中断标志位置位,至于线程作何动作那要看线程了。

如果线程sleep()、wait()、join()等处于阻塞状态,那么线程会定时检查中断状态位如果发现中断状态位为true,则会在这些阻塞方法调用处抛出InterruptedException异常,并且在抛出异常后立即将线程的中断状态位清除,即重- 新设置为false。抛出异常是为了线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。
如果线程正在运行、争用synchronized、lock()等,那么是不可中断的,他们会忽略。
可以通过以下三种方式来判断中断:

isInterrupted()
此方法只会读取线程的中断标志位,并不会重置。
interrupted()
此方法读取线程的中断标志位,并会重置。
throw InterruptException
抛出该异常的同时,会重置中断标志位。

notify()

在Java中,notify()和notifyAll()都可以用于线程的唤醒,但它们有以下几个区别:

1. 唤醒数量不同

notify()方法只会随机唤醒等待队列中的一个线程,而notifyAll()方法则会唤醒等待队列中的所有线程。

2. 调用方式不同

notify()和notifyAll()方法都必须在同步代码块中调用,并且必须包含在synchronized块中,且必须是该对象的监视器对象才能够调用。而且只有在获取了锁之后才能调用,否则会抛出IllegalMonitorStateException异常。

3. 竞争情况不同

notify()方法只会唤醒等待队列中的一个线程,并使其与其他线程竞争获取锁,这可能会导致某些线程无法被唤醒或者一直处于等待状态。

notifyAll()方法则会唤醒等待队列中的所有线程,并使它们竞争获取锁,这样可以使所有线程都有机会获取锁并进入运行状态,从而避免了一些线程一直处于等待状态。

因此,在多线程编程中,如果需要唤醒所有等待该对象的线程,则可以使用notifyAll()方法;如果只需要随机唤醒一个等待该对象的线程,则可以使用notify()方法。
 文章来源地址https://www.toymoban.com/news/detail-682311.html

到了这里,关于Android系统-线程-java线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android h5 宿舍报修管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计

    一、源码特点   android h5 宿舍报修管理系统是一套完善的WEB+android设计系统,对理解JSP java,安卓app编程开发语言有帮助(系统采用web服务端+APP端 综合模式进行设计开发),系统具有完整的 源代码和数据库,系统主要采用B/S模式开发。 二、功能介绍 本系统的最终用户为学生

    2024年02月12日
    浏览(32)
  • Android开发-应用中英文(语言)切换(二)

            APP中针对不同国家不同地区的人群使用那么应用的语言自然也要能够随时进行切换,最近做的项目有中文和英文切换的需求,所以在了解了一下网上常用的方法后记录一下我使用的方法,只是简单的应用,后续如果有不同需求需要自己去改。♻          新建工程就

    2024年02月09日
    浏览(34)
  • Android开发:kotlin语言实现简易计算器

    输入两个数字,可选加减乘除操作符,并计算显示对应结果 随系统切换语言 可对结果进行四舍五入操作 界面布局:activity_main.xml文件代码 字符定义:string.xml文件代码 逻辑实现:MainActivity.kt 文件代码 方法一(偷懒): 复制文件到对应位置 方法二: 1. 绘制界面 2. 编写逻辑

    2023年04月08日
    浏览(33)
  • Android系统开发 使用windows系统的WSL编译Android10系统

    本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17815468.html 本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。   在自学framework的时候,最大的难题就是如何动手实践修改

    2024年02月05日
    浏览(42)
  • android 获取当前系统选择的语言

    获取当前系统选择的语言的Java代码: Locale currentLocale = Locale.getDefault(); String currentLanguage = currentLocale.getLanguage(); String currentCountry = currentLocale.getCountry(); String currentLocaleString = currentLocale.toString();   其中,`currentLanguage`为当前语言的ISO 639-1代码,例如:`en`表示英语,`zh`表示中文

    2024年02月08日
    浏览(37)
  • 【Android】使用 `reactor.core.scheduler.Schedulers` 提供的线程池让开发者更加灵活地执行任务

    在 Android 开发中,使用 reactor.core.scheduler.Schedulers 提供的线程池可以让开发者更加灵活地执行任务,并且可以根据具体情况选择最合适的线程。 下面列举几种常用的线程池和其适用场景: Schedulers.single() :该调度器会使用单个线程来执行任务,适用于需要按照先后顺序依次执

    2024年02月09日
    浏览(47)
  • android studio没有java语言选项怎么办

    我的android studio没有java语言选项怎么办。我打算用java来做一个android应用,但是好像没有看到有java选项,我这个是ubuntu系统 其实运气可能是太好了点。应为你会发现,随便选一个都会有java选项,唯独empty那个没有java,然后我就选到了那个,所以解决的办法就是选择其他选项

    2024年03月17日
    浏览(41)
  • Android 系统开发工具

    SSH 服务使得我们在其他平台上通过 SSH 客户端程序即可访问到我们的 linux 服务器。方便我们的开发工作。 接下来我们分为两步来介绍 ssh 服务的搭建以及客户端的使用: 安装 openssh-server 配置固定 IP 地址 使配置生效: 至此,固定 IP 就配置好了。 Samba 是一款数据共享的软件

    2024年02月16日
    浏览(37)
  • Android系统开发-入门篇

    参见:[视频教程] 写给应用开发的 Android Framework 教程——玩转 AOSP 篇之 Android 系统开发工具推荐 - 掘金 前置条件: android系统源码位于 linux 服务器,ssh 地址假如为:test@172.1.10.2 本机为windows 1、本机:         下载VSCode,安装remote-ssh插件         打开 Git-Gui程序,执

    2024年02月16日
    浏览(37)
  • Android studio实现财务记账系统软件android studio开发课程设计

    Android 开发一个理财记账系统软件(app)的详细实验步骤,内附有源码,小白也能轻松上手自己的软件开发项目学生可当课程设计学习使用。 系统登录/退出 设置/修改密码 主活动页面设计 增加收入记录页面 查看收入记录页面 修改和删除记录页面 1、实验名称 数据库的创建 2.

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包