Java多线程学习

1、进程:程序或者任务的执行过程(动态的),持有资源(共享内存、共享文件)和线程,是资源和线程的载体。同一个进程可以有多个线程。

2、线程:任务,执行明确的某一项详细操作,进程中的最小执行单元,共享进程的资源。

3、线程的交互:互斥  (锁、等待、串行)、同步(并行)

4、Thread.join:可让父线程等待子线程结束之后才能继续运行

Thread.yield:线程让步。当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!这个是看最终由哪个线程抢占到了CPU资源

5、停止线程的方法stop()不好地方:立马终止线程,不知道线程的执行情况,没有做对应的清理工作

6、较好的停止线程的方式:使用退出标志

7、thread.interrupt:当线程因为某些方法被阻塞时,如join、sleep、wait等,interrupt方法会将这个线程的中断状态做清除,并且抛出一个InterrupetedException的异常。此时使用isInterrupted方法,就不能返回表示是否被中断的状态。如果因为方法调用方式的变动导致线程退出行为的差异,则不是很好的停止线程的方法。(如下图所示,用方法1时,可以正常中断,方法二则不能)

Java多线程学习_第1张图片

8、当多个线程同时访问同一数据共享变量(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏,这种现象称为争用条件。

9、可以使用synchronized(intrinsic lock)通过锁来实现线程互斥,同时,在资源还没有满足条件时,可以用wait做阻挡,将线程放置在wait set中,而不是继续竞争CPU资源。同时在做完操作后,通过lock的notifyAll去唤醒锁上其他所有待执行的线程继续竞争CPU资源,实现线程的同步。

10、互斥:关键数据在同一时间只能被一个线程所访问;同步:多条线程在交替执行时确保共享资源的正确/安全性

后续学习:JMM、happens-before、Lock&Condition对象(Java锁机制和等待的高层实现,java.until.concurrent.lock)、多线程常用的交互模型(生产者-消费者模型、读写锁模型、future模型、worker thread模型的原理、在Java中哪些类实现了并且可以供我们调用)、Java5中并发编程工具(java.until.concurrent、ExecutorService线程池、Callable&Future、BlockingQueue)

from imooc Arthur,thx~

你可能感兴趣的:(Java学习)