Java线程的创建、阻塞、并行

    由于进程包含了指令及其所需的资源,因此进程间的转换会带来大量的开销。而线程作为轻量级的任务,自己基本不拥有系统资源,其间的转换与通信的开销也较小。所以线程间的调度也相对简单。

一、那么线程又是如何创建的呢?java中主要通过两种方式来创建线程。(均以Thread类为基础,使用方法不同)

    1.继承Thread类。

    Thread线程类中封装了对线程的所有操作控制。我们可以通过新创建一个继承自Thread的类,如 newThread 类,并重写其 run() 方法来重新创建线程体(即此线程所需要执行的操作)。

    2.实现 Runnable 接口(仍然使用Thread类,只是在创建Thread类对象的时候所用的方法传入了Runnable类实例)

    首先新创建一个 newRunnable 类继承自 Runnable 类,并重写 run() 方法。使其再通过在创建Thread类对象时传入的  Runnable 对象实例以实现新的线程。


二、在完成了线程的创建后,我们需要调用线程的 start() 方法,使线程由新建态转为就绪态,等待CPU 的调度。若轮到其执行(说明可以脱离创建它的线程,开始自己独立的生命周期),则自动执行线程的 run() 方法——即线程体。在执行过程中,若遇到 sleep() 方法,则线程休眠一定时间,此时并不占用CPU资源。Thread类的currentThread() 方法可以通过Thread.currentThread()语句直接调用,并返回当前使用CPU 资源的线程,随后便可以对其进行一系列操作。

三、若线程被wait(), sleep(), join() 这三个方法阻塞,而此时有其他线程调用该线程的interrupt() 方法,则此线程会抛出一个InterruptException() 异常,提早终结被阻塞状态 ,这是因为线程的上述三个方法中会一直检查是否有InterruptException异常。若调用interrupt() 方法时线程不阻塞,则直到线程执行wait(), sleep(), join() 方法时才会抛出异常。此修饰词返回类型和访问修饰符中间,如public synchronized void... 。

    其中wait() 方法:在等待时并释放机锁。机锁是指在new创建对象时Heap中会给对象中的对象头2bit的大小用于记录锁类型。而访问此对象会获取对象的对象锁,其他线程无法访问。而wait() 方法会使机锁释放,供其他线程使用。即wait() 方法的优点在于线程则阻塞时不会一直”占用“对象。

    其中join() 方法:在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。可理解为“插入式阻塞”。  


四、线程的并行时会出现临界资源的访问问题。java中提出了一个通过修饰词的解决方案。对涉及临界资源访问的线程,对其中的临界函数 (修改临界资源的函数) 添加一个synchronized修饰词。因为多个线程调用synchronized方法时需遵循同步机制,一个进程使用此方法时,其他线程需等待,直到该线程结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值