Java多线程编程

      Java的线程类可以有两个选择:一个是扩展Thread类,然后重装它的run方法;另一个是实现Runnable类,实现它的的run方法,然后用new Thread(实现Runnable的类)方法生成对应的线程对象。关于该线程的操作在run方法中实现。

      线程的运行是调用它的start方法,它会调用run方法,记住不是直接调用run方法。

      产生线程后,接下来是线程的控制和通信了。

      在讲这个之前先讲一下线程的状态。线程有5个状态:开始、就绪、运行、阻塞、结束。当一个线程开始之后处于就绪状态,此时的线程是可运行的,只要CPU给它分配了时间它就可以运行;一个线程获得了CPU时间后就开始运行,此时是处于运行状态,直到运行结束后转到结束状态,或者因为自己休眠让出CPU时间、等待其他线程的结果、等待IO操作等而转到阻塞状态;处于阻塞状态的线程必须在其被唤醒之后才能转到就绪状态等待分配CPU时间。关于这些内容的深入可以参考一下操作系统这部分的知识。

      可以使用Thread类的sleep(long mills)让该线程休眠,使用yield让该线程让出CPU时间给其他线程使用,使用thread2.join()方法让调用该方法的线程处于阻塞状态,等待thread2线程直到它运行完后才处于就绪状态。关于通信的方法还有wait、notify、notifyAll等,wait不用等到线程结束才可以唤醒,只要被等待的线程满足某个条件后调用notify或notifyAll就可以唤醒等待它的某个线程或所有线程。结合以上各种方法可以实现线程间的通信协作。

      因为资源有限,如果多个线程使用同样的资源,可能产生冲突,即所谓的竞争。此时需要进行同步,即对资源进行加锁。可以使用synchronized关键字对要使用的资源进行同步,有两种使用方法:一个是对资源使用的临界区,即对资源的操作用一个方法实现,将该方法申明为synchronize;一个是用synchronize(expr){},expr必须可以求出对象的引用,一般是要使用的资源,对资源的操作在{}的代码段里面。

      好了,既然线程可以对资源进行加锁,那么就可能存在死锁的情况。比如线程1先锁了资源A,线程2先锁了资源B,然后线程1接着锁资源B,线程2接着锁资源A。因为线程2已经锁了资源B,所以线程1得等线程2释放资源B才能运行,同样线程2得等线程1释放资源A才能运行,这样就形成了1等2,2又等1的情况,即死锁。

      解决死锁的方法是用资源排序的技术,即给每一个需要锁定的对象定义一个顺序,确保每个线程都按这个顺序来锁定对象。对上面的例子,假设按资源A、资源B的顺序排序这两个对象,采用这种技术,那么线程2必须先锁定资源A,然后才能锁定资源B。一旦线程1锁定了资源A,线程2只能等待对资源A的加锁,所以线程1就能锁定资源B,不会发生死锁现象。

      关于Java的多线程编程就学了这些内容,如果还有的请大家补充,一起交流学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值