Java——线程

实现多线程的方法

extends Thread

implement Runnable

new Runnable(){} 不是实例化Runnable接口,是一种内部类的简写。

run()和start()的区别

run()方法只是类的一个普通方法。如果直接调用run()方法,程序中依然只有主程序这一线程,其程序执行路径只有一条,还是要顺序执行。
等run()方法执行完毕后才可以继续执行下面的代码。

start方法,真正实现多线程,通过调用Thread类的start方法来启动一个线程,这时线程处于就绪(可运行)状态,并没有运行,得到cpu时间片后,就开始执行run()。
注意:得到cpu时间片后不需要等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

Thread类

  • Thread.yield()方法的作用:暂停当前正在执行的线程对象,并执行其它相同优先级线程。yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行态转到可运行态。
  • Thread.sleep()方法(休眠)是线程类Thread的静态方法,调用此方法让当前线程暂停执行指定的时间,将执行机会让给其它线程,但是线程锁依然保持,因此休眠时间结束后会自动恢复。
    Thread.sleep()和Object.wait都可以抛出InterruptedException,且该异常为检查异常,不能忽略。
  • Object.wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有待用notify()或者notifyAll()才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。
  • Thread.join()
    join()被打断会导致interruptedException异常。
    Thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B调用了线程A中的join方法,直到线程A执行完毕后,才会继续执行线程B

Daemon线程

setDaemon()设置必须要在start()之前,当线程正在运行时调用会产生异常。

Thread Local类

  • 采用哈希表的方式来为每个线程提供一个变量的副本;
  • 保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏。

线程安全类

HashTableVectorStackenumerationStringBufferPropertiesconcurrentHashMap

线程中断或停止运行的情况

  • InterruptedException异常被捕获
  • 线程调用wait()方法,强行打断当前操作,进入阻塞状态,需要用notify()或notifyAll()方法才能进入就绪状态。

CyclicBarrier屏障类

await()方法可以简单理解为:等待多个线程同事到达之后才能继续进行,在此之前它是这些线程的屏障,线程不能继续进行。对于失败的同步尝试,CyclicBarrier使用一种要么全部要么全不(all-or-none)的破坏模式:如果因为中断、超时或失败等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其它线程也将通过BrokenBarrierException(如果它们几乎同时被中断,则用interruptedExcption)以反常的方式离开。

线程局部存储TLS(thread local storage)

  • 解决多线程中的对同一变量访问冲突的一种技术。
  • TLS会为每一个线程维护一个和该线程绑定的变量副本。
  • Java平台的java.lang.ThreadLocal是TLS技术的一种实现

关键字

volatile

多线程访问volatile不会发生阻塞。
volatile保证数据的可见性有序性,但不能保证原子性。
volatile解决变量在多线程之间的可见性。
不能保证线程安全。

synchronized

锁定当前变量(互斥锁),只有当前线程可以访问该变量。
多线程访问synchronized会出现阻塞。
synchronized保证数据的可见性有序性原子性
synchronized解决多线程之间资源同步问题。

注意:资料来自牛客网以及大佬们的回答

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值