Java多线程初学笔记

本笔记大部分内容来自慕课网的视频:深入浅出Java多线程:http://www.imooc.com/learn/202


1.Java多线程在日常编程中使用的非常多,因此,对于一些常见的知识有必要做一些笔记。这里主要介绍运用在多线程中的一些基本方法。

(1)位于java.lang.Thread中的yield()方法。

作用:使当前调用该方法的线程让出CPU资源,使得所有线程重新竞争获得CPU资源。

(2)位于java.lang.Thread中的join()方法。

作用:使当前调用该方法的线程独占CPU资源,直到该线程终止。


2.在Java一个不断运行的线程中,需要停止这个线程的方法有很多种,常见的几种正确和错误的方法:

错误的方法:(1)使用java.lang.Thread.stop()方法。
这个方法已被Java标记为 @Deprecated,表示这个方法并不安全。

错误的方法:(2)使用java.lang.Thread.interrupt()方法。

调用Object类的wait()方法,或者该类的 join()或sleep() 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

正确停止线程的方法:(3)设置标志位flag,可保证线程内一次任务的完整执行。


3.同步与互斥

(1)通过synchronized关键字来给指定对象加锁,保证同一时间只能有一个线程获得该对象的锁,即保证了synchronized内部的代码在一个时刻只能有一个线程进行操作。

代码:

synchronized(obj)

{

      // 此处添加同步代码

}

(2)通过java.lang.Object的wait()方法,可以将当前线程放入Wait Set中,以免当前线程继续争用锁对象,消耗CPU资源。

对象调用wait()方法后,首先释放锁,然后当前线程进入Wait Set中。其他线程调用notify()方法后,将唤醒Wait Set中的某一条线程,或调用notifyAll()方法,将唤醒Wait Set中所有线程,使它们有机会重新争用CPU资源。

代码:

synchronized (obj) {

while (<condition does not hold>)

obj.wait();

... // Perform action appropriate tocondition

}

(3)通过java.lang.Object的notify()notifyAll()方法,可以唤醒在Wait Set中的线程,使得他们有机会重新争用锁对象。注意:notify()方法只能唤醒Wait Set中的一条线程,但并不能决定是哪条线程;而notifyAll()是唤醒Wait Set中的所有线程。

代码:

synchronized (obj) {

... // Perform action appropriate tocondition

... // TODO Your job

notify();

}

(4)wait()方法和notify()方法或notifyAll()的典型使用代码如下:

代码:

synchronized (obj) {

while (<condition does not hold>)

obj.wait();

... // Perform action appropriate tocondition

... // TODO Your job

notify();

}

示意图:



4.线程的五种状态

(1)新建状态(NEW

使用new线程后的状态。

(2)就绪状态(RUNNABLE

线程在争用锁之前的状态或者被notify()或notifyAll()方法唤醒的状态,或者是sleep()过后的状态,或者是调用Thread.start()方法后的状态。

(3)运行状态(RUNNING

线程在CPU中运行的状态,即调用Thread.run()方法后的状态。

(4)阻塞状态(BLOCKED

当方法调用了sleep(),wait()方法时,将使线程进入阻塞状态。

(5)死亡状态(DEAD

线程运行完或者是未捕获异常终止了run()方法。

五种状态转换示意图:



5.想要更深入了解Java多线程并发编程,可学习以下知识:

(1)JMM : JAVA Memory Model

JMM描述了Java线程如何通过内存进行交互,了解happens-before原则,以及happens-before原则的关键字:synchronized , volatile & final

(2)Locks & Condition 类

java.util.concurrent.locks 中的Locks 和 Condition接口

这两个接口说明了Java锁机制和等待条件的高层实现。

(3)线程安全性

线程安全性包括原子性和可见性,了解java.util.concurrent.atomic下的类的操作,了解synchronized 和 volatile 关键字,以及死锁(Deadlocks)

(4)多线程编程常用的交互模型

常见的多线程交互模型包括Producer-Consumer(生产者-消费者)模型、Read-Write Lock 模型、Future 模型、Worker Thread 模型

(5)Java中并发编程工具

包括java.util.concurrent下的所有类,线程池,java.util.concurrent.ExecutorService,java.util.concurrent.Callable & java.util.concurrent.Future,java.util.concurrent.BlockingQueue

(6)推荐两本书

CORE Java : Volume I – Fundamental

JAVA Concurrency in Practice


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值