多线程解析

多线程指一个程序运行时产生了不止一个线程,使用多线程可以提高程序的效率提高cpu使用率,在Java程序中JVM负责线程的调度,采用抢占式调度。

创建线程有四种方式1.继承Thread类重写run方法2.实现Runnable接口实现run方法3.实现Callable接口,实现call方法,允许方法有返回值允许抛出异常4.通过线程池创建线程;

线程的生命周期有5种状态分别时新建、就绪、运行、阻塞、死亡状态,新建一个线程对象后调用start方法,该线程就进入了可运行状态,当该线程获取了CPU资源就进入运行状态执行程序代码,线程由于某种原因放弃CPU使用权包括sleep()join()wait()等进入阻塞状态,暂时停止运行,当sleep状态超时,join等待的线程终止或超时,被notify唤醒等线程重写转入就绪状态。sleep不会释放持有的锁,wait会释放锁。当线程执行完了或因异常退出了run方法后该线程进入死亡状态。

如果需要在线程执行到一定时间时中断线程,一般使用标记中断法,在线程类中定义一个变量isStop用于表示是否结束线程,在run方法中定义while循环根据isStop的值判断是中断还是运行代码,再定义一个public方法修改isStop的值。

线程包括用户线程和守护线程,用户线程是我们平常创建的普通线程,守护线程是用来服务用户线程的,若所有用户线程终止了,守护线程也会自动停止。除主线程外其它线程都可以设置为守护线程。

join()方法,等待其他线程终止。在当前线程b中调用线程a的join()方法,则当前线程b转入阻塞状态,直到另一个进程a运行结束,当前线程b再由阻塞转为就绪状态。内部使用wait方法实现。

sleep方法是Thread类提供的用于实现线程休眠的方法,需要设置休眠时间,时间到了自动唤醒;
wait方法是Object类提供的用于实现线程阻塞的方法,wait后线程不会自动唤醒,需要持有该对象监视器的线程调用notify或notifyAll才能唤醒;sleep不会释放对象锁,wait执行后会释放对象锁。使用wait方法时必须持有该对象的对象锁。

并发编程三要素是原子性、有序性和可见性,原子性要求线程中每一步的操作是不可分割的;JVM在对字节码操作时内部会进行指令重排,而有序性要保证代码每一步都是按顺序执行的;可见性指无论哪一条线程修改了共享变量,其他线程都能立刻看到变量的变化。

异步执行指多线程并发执行,可能出现线程安全问题故需要线程同步,即将多个线程排队执行保证程序的有序性和原子性。使用Synchronized关键字实现同步操作,修饰成员方法时是方法锁,当方法获取调用该方法的实例对象的锁后执行并独占锁,直到方法返回则释放锁。修饰代码块时以一个引用对象作为锁的对象,执行前先获取该对象的锁。对象锁用来控制实例方法间的同步,类锁用来控制静态方法之间的同步。

当前线程拥有其他线程需要的资源,当前线程等待其他线程已拥有的资源都不放弃自己的资源。避免死锁的方法有1.固定加锁的顺序,2.使用定时锁tryLock()获取锁时间超时则会抛出异常。

volatile能保证共享变量的可见性和有序性,每个线程有一个自己的工作内存,存放了共享变量副本,所有volatile修饰的变量一旦被某个线程更改必须立即刷新到主内存中,使用volatile修饰的变量之前必须重新从主内存中读取
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值