今天,我们开始Java高并发与多线程的第三篇,线程的基本属性和主要方法。

【属性】

  • 编号(ID)

  类型long

用于标识不同的线程,编号唯一,只存在java虚拟机的一次运行

  • 名称(Name)

  类型String

可以不设置,默认值为Thread-线程编号

  • 线程类别(Daemon)

  类型boolean

主要用于区分用户线程和守护线程

值为true表示该线程为守护线程,否则为用户线程

默认值与相应线程的父线程该属性值相同,该属性必须在线程启动前设置!否则会报错

    • 用户线程

    用户行为运行的线程;

一个Java虚拟机,必须等待所有的用户线程结束之后才可以停止运行。

    • 守护线程

    通常用于执行一些重要性不是很高的任务,比如监控资源等;

守护线程不会影响Java虚拟机的正常停止。

  • 优先级(Priority)

  类型int

该属性是给线程调度器的提示,用于表示应用程序那个线程优先运行,但是并不保证真实的线程执行顺序。

java定义了1~10的10个优先级别。默认值为5(普通优先级别)。

对应一个具体的线程而言,优先级别的默认值与父线程相同。

注:在JVM中,使用-Xss参数来控制每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M.

【常用方法】

  • public static native Thread currentThread()

  返回当前线程,当前代码的执行线程

  • public long getId()

  此方法返回线程的唯一标识,是一个long型的正数,在线程创建的时候被赋值。

  • public final native boolean isAlive()

  isAlive方法用于判断当前线程是否处于活动状态。

什么是活动状态呢?

活动状态就是已经启动尚未终止的,线程处于正在运行或者准备开始运行的状态就认为线程是"活动"的。

(新建状态的线程isAlive()返回的是false)

  • public synchronized void start()

  启动线程

  • public void run()

  线程的实际执行方法

  • public void interrupt ()

  interrupt() 中断线程  由运行状态到死亡状态。

在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 "。

中断线程操作实质上是修改了一下中断标示位为true

当前线程正在运行,仅仅修改标示位,不再做其他的事

当前线程正在阻塞,修改标识位,如果是join,sleep,yield,则会抛出Interrup异常,修改标示位为false

  • public static boolean interrupted()

  测试当前线程是否已经是中断状态,执行后具有清除中断状态功能

  • public boolean isInterrupted()

  测试线程 Thread 对象是否已经是中断状态,但不清除中断状态标志

  • public static native void yield()

  此方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU的时间。但是放弃的时间不确定,有可能刚刚放弃就马上获得CPU时间片。

sleep 方法使当前运行中的线程睡眠一段时间,进入超时等待状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。

yield()不会释放锁标志

yield()只是使当前线程重新回到可运行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

yield()只能使同优先级或更高优先级的线程有执行的机会

  • public static native void sleep(long millis) throws InterruptedException

  sleep 导致当前线程休眠;

与 wait 方法不同的是 sleep 不会释放当前占有的锁

sleep(long)会导致线程进入 TIMED-WATING状态,而 wait()方法会导致当前线程进入 WATING状态

可以抛出中断异常

Thread.sleep(0)

由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。

  • void join()

  等待相应线程结束,若线程A调用B的join方法,那么线程A会被暂停,直到线程B运行结束。

join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。

join(0)等价于join()

  • public final void setPriority(int newPriority)

  设置线程优先级

  • public final void setDaemon(booleanon)

  将线程设置为守护线程

  • public static int activeCount()

  程序中活跃的线程数

  • public static native boolean holdsLock(Object obj)

  当前线程是否拥有某个具体对象的锁。

  • @Deprecated

  public final void stop()

强制停止,已废弃

可能释放锁导致数据不对。

可能导致清理工作做不好。

  • suspend和resume

  暂停和恢复

同上,已废弃。

  • public final native void wait (longtimeout)

  继承object

调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的

是调用 wait()方法后,会释放对象的锁

因此,wait 方法一般用在同步方法或同步代码块中。

  • public final native void notify()

  继承自object

唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。

但是要注意,notify不释放锁

类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。

  • public final native void notifyAll()

  把该对象等待队列里面的所有线程唤醒,成为可运行线程。

本篇比较短,但是因为容易被遗漏掉,所以单独拿出来讲,下一篇咱们讲多线程里面的重头戏------锁。

Java高并发与多线程(三)-----线程的基本属性和主要方法的更多相关文章

  1. Java高并发与多线程(二)-----线程的实现方式

    今天,我们开始Java高并发与多线程的第二篇,线程的实现方式. 通常来讲,线程有三种基础实现方式,一种是继承Thread类,一种是实现Runnable接口,还有一种是实现Callable接口,当然,如 ...

  2. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  3. java高并发编程(三)

    java高并发主要有三块知识点: synchronizer:同步器,在多个线程之间互相之间怎么进行通讯,同步等: 同步容器:jdk提供了同步性的容器,比如concurrentMap,concurren ...

  4. Java高并发与多线程(一)-----概念

    其实之前一直想专门写一篇,单独说一说Java的多线程与高并发,但是一直以来,都没有想到能够用什么比较有趣的表现形式去表达出来,而且网上充斥着很多类似的博客,有好的又不好的,有简介的有繁琐的,所以也一直 ...

  5. Java高并发和多线程系列 - 1. 线程基本概念

    1. 什么是线程? 线程和进程的区别 在了解线程的概念前,我们应该先知道什么是进程? 进程是操作系统的基本概念之一, 它是正在执行的程序实例. * 下面的一些进程的基本概念你可以了解下 ------- ...

  6. java高并发实战(三)——Java内存模型和线程安全

    转自:https://blog.csdn.net/gududedabai/article/details/80816488

  7. Java高并发网络编程(三)NIO

    从Java 1.4开始,Java提供了新的非阻塞IO操作API,用意是替代Java IO和Java Networking相关的API. NIO中有三个核心组件: Buffer缓冲区 Channel通道 ...

  8. java高并发锁的三种实现

    提到锁大家会想到Synchronized同步关键字,使用它确实可以解决一切并发问题,但是对于体统吞吐量要求更高,在这里提供了几个小技巧.帮助大家减少锁粒度.提高系统的并发能力 一.乐观锁 试用场景:读 ...

  9. Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)

    摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...

随机推荐

  1. IDEA 2020.3 更新了,机器学习都整上了

    Hello,大家好,我是楼下小黑哥~ 上周 Java 开发申请神器 IDEA 2020.3 新版正式发布: 小黑哥第一时间就在开发机上更新了新版本,并且完整体验了两周了. 下面介绍一下这个版本的主要功 ...

  2. js处理浏览器兼容

    1.try  catch 在try中执行我们的代码,如果在执行的过程中发生了异常信息,我们在catch中写代替的执行方案 前提:不兼容四位情况下,执行对应的代码,需要发生异常错误才可以检测到 弊端:不 ...

  3. 刚入坑之C#《方法》解说

    说好的用一周时间学方法,我都快耽误成两周了.原因就是跟着传智播客的课程做了个飞行棋项目,想要梳理其中的方法却把自己绕晕了.那接下来我先说一下我学到方法的内容,在最后献上飞行器项目的代码,当然是传智播客 ...

  4. RabbitMQ史上最全文章

    老规矩,本篇文章 不做 RabbitMQ 的 编码讲解 ,只介绍 文章学习的一些优秀文章 重点在于不要循规蹈矩,教程 这样走,你不一定要按他这样走,按自己的方式来,学习效率会更高,网上的教程有很多,今 ...

  5. DRF终极封装ViewSet和Router附教程PDF源码

    在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...

  6. Error:(12, 24) 警告: [deprecation] android.hardware中的Camera已过时.android

    问题:android studio编译项目时出现: Error:(12, 24) 警告: [deprecation] android.hardware中的Camera已过时 解决:(只是让其不提示) ...

  7. ConcurrentHashMap线程安全吗?

    前言 没啥深入实践的理论系同学,在使用并发工具时,总是认为把HashMap改为ConcurrentHashMap,就完美解决并发了呀.或者使用写时复制的CopyOnWriteArrayList,性能更 ...

  8. Qt学习笔记-Qt5和Qt4在音频方面的不同-QtAV

    之前学习qt4的时候,播放音频用的是phonon播放后端插件+mplayer. 今天改用qt5了.qt5中去掉了phonon模块加了multimedia.但是依然无法播放音乐,因为没有ffmpge s ...

  9. 什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?

    内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统.CDN的目标是为具有高可 用性和高性能的最终用户提供内容. 有3个流行的jQuery CDN:谷歌,微软jQu ...

  10. CMS、G1收集器

    目录 CMS.G1收集器 1.CMS收集器 1.1.原理 1.2.不足 2.G1收集器 2.1.特点 2.2.执行过程 CMS.G1收集器 1.CMS收集器 CMS(Concurrent Mark S ...