Java多线程学习笔记(一)

Java多线程学习笔记

记录一下时间,第一次为2019/07/16,传说多线程为java核心,终于有时间来学习一下了。该笔记参考书籍为《java多线程编程核心技术》。

技能

这一张讲了很多琐碎点,也可以参照jdk源码理解,Thread类的核心方法很多,着重掌握以下内容:

  • 线程的启动
  • 如何使线程暂停
  • 如何使线程停止
  • 线程的优先级
  • 线程的安全相关问题
  1. 进程与线程的概念

    进程–操作系统管理的基本单元;
    线程–组成进程的部分,如QQ中的文件管理,表情发送等
    至于更多的区别请查阅操作系统一书。
    线程被调用的时机是随机的,多线程是异步的

  2. 使用多线程

    实现多线程的方式有两种,一种是继承Thread类,另一种是实现Runnable接口。

    public class Thread implements Runnable

    在使用多线程的时候,代码的运行结果与代码的执行顺序或者调用顺序无关。

    Thread的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。
    如果调用thread.run()方法,就是同步调用,是顺序执行代码的。

    执行start()的顺序不代表线程的启动顺序。

    synchronized可以在任意对象及方法上加锁,而加锁的代码块成为“互斥区”或“临界区”。

    println()方法在内部是同步的,但是println(i–);却不是,因为i–是在进入println()之前发生的。

        public void println(String x){
                synchronized(this){
                    print(x);
                    newLine();
                }
          }
    
  3. currentThread()方法

    currentThread为静态方法,指向的是当前上下文的线程。

  4. isAlive()方法

    判断当前对象线程是否处于活动状态。

  5. sleep()方法

    该方法是让正在执行的线程休眠(暂停执行)指定的毫秒数。
    “正在执行的线程”是指this.currentThread()返回的线程

  6. getId()方法

    用于获取线程的唯一标识。

  7. 停止线程

    Thread.stop()方法不应该使用,因为是不安全的。,应该使用Thread.interrupt()方法。
    Thread.interrupt()方法仅仅是在当前的线程中做了标记,并不是真的停止线程。

    判断线程停止状态的方法

    方法名 是否为静态方法 执行对象 清除状态
    this.interrupted() 当前线程 将状态标志清除为false
    this.isInterrupted() 测试线程 不清除

    有很多种停止线程的方法,如异常法,沉睡中停止,暴力停止(stop),return停止。

  • 异常法(主推):使用interrupted()函数检测,停止时,抛出异常。
    
  • 沉睡中停止:线程在sleep状态下停止,会抛出异常,清除状态。一定要先沉睡,再interrupt();若相反的话,线程会先停止,遇见sleep后再抛异常。
    
  • return:与异常法相似,不推荐该方法,会显得程序很乱。
    
  1. 暂停线程

    暂停方法:suspend
    恢复方法:resume
    缺点:

  • 独占:使用不当,会造成对公共对象的无法访问;
    
  • 不同步:多线程会造成数据的不同步
    
  • 废弃:这组方法已经被废弃。
    
  1. yield方法

    放弃当前cpu资源,放弃的时间不确定。

  2. 线程的优先级

    优先级较高的线程得到的cpu资源较多。

        private final static int MIN_PRIORITY = 1
        private final static int NORM_PRIORITY = 5
        private final static int MAX_PRIORITY = 10
    

    线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。

    高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。

  3. 守护线程

java线程
用户线程
java线程
GC垃圾回收

本章结尾

  • 线程的启动

    thread.start()方法

  • 如何使线程暂停
    推荐wait()和notify()方法,尽量使用并发类框架

  • 如何使线程停止
    异常法

  • 线程的优先级
    最小在,最大,正常

  • 线程的安全相关问题
    stop,suspend,resume方法都不要使用,做好共享资源的同步;

发布了42 篇原创文章 · 获赞 37 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览