当sleep中的线程被调用interrupt()时,就会放弃暂停的状态,(sleep线程)并抛出InterruptedException异常。
当对wait中的线程调用interrupt()时,(wait线程)会先重新获得锁定,在抛出InterruptedException异常。
当join(等待其他线程结束)的线程被调用interrupt()时,就会放弃等待状态,(join线程)并抛出InterruptedException异常。
interrupt()方法只会改变被interrupt的线程的中断状态(interruptstatus)而已。
线程在执行sleep、wait、join时,是在这些方法内不断检查interruptstatus的值,如果true了,则自己抛出InterruptedException。
如果在线程还没有执行sleep、wait、join前,就去interrupt它,并不会影响它的正常工作,只有它执行到sleep、wait、join时,才马上抛出InterruptedException。
------------------------------------------------------------------------------------
在进一步阐述之前,我们需要明确几点:
A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)与之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
接着来讨论synchronized用到不同地方对代码产生的影响:
假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。
1. 把synchronized当作函数修饰符时,示例代码如下:
Public synchronized void methodAAA()
{
//….
}
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。
上边的示例代码等同于如下代码:
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
(1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:(
2.同步块,示例代码如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance变量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
分享到:
相关推荐
然而,由于 .Net 提供了多种多样的多线程工具和技术,初学者往往会感到困惑,不知道如何选择最适合自己的场景的技术。本文将重点介绍使用 .Net 的 `Thread` 类进行多线程编程的基本方法,并通过一个具体的 C# 示例来...
Java线程是多任务编程的重要概念,特别是在..."1-2论坛"可能包含了一些讨论和问题解答,可以帮助你解决学习过程中遇到的困惑。通过学习这个教程,你将能够掌握Java线程的基本操作,为后续的多线程编程打下坚实的基础。
例如,作者可能对`this`关键字在不同上下文中的含义感到困惑,尤其是在`printMsg()`方法中如何区分调用它的线程。 #### 7. **异常处理与代码健壮性** 代码中并没有包含异常处理的逻辑,但在实际的多线程编程中,...
在Java编程中,线程是一个非常重要的概念,也是很多程序员感到困惑的地方。线程是程序执行流的最小单元,它允许一个程序在同一时间执行多个任务,从而提高了程序的效率和资源利用率。本文档旨在深入探讨Java线程的...
这是一个让能让你的老爷CPU拥有超线程能力的不错的软件,可防止,一些主板和CPU工作假死,造成的困惑。
Java中的线程安全性是并发编程中的关键概念,它关乎到多线程环境下程序的稳定性和正确性。...在编写类的初期就记录其线程安全性,不仅可以避免未来的困惑,也有助于确保代码质量,使得维护和扩展变得更加容易。
在IT开发过程中,用户体验往往是非常重要的一环,特别是在执行耗时操作时,用户可能会因为程序无响应而感到困惑或不耐烦。此时,利用“等待动画”可以有效地提高用户的感知体验,表明程序正在运行并未卡死。标题为...
这种可视化表示有助于用户理解程序的状态,避免因为长时间无响应而感到困惑。 **2. C#中的多线程** 在C#中,多线程用于同时执行两个或更多任务,这样可以充分利用多核处理器的优势,提高程序性能。在进度条的场景中...
在高等教育中,计算机专业学生在学习过程中往往对传统单机单线程编程感到困惑,可能对传统程序设计学习的必要性产生怀疑。通过开展单线程、多线程与分布式排序对比实验,可以使学生更深刻地理解传统编程与现代分布式...
然而,多种多线程模型的存在可能会让开发者感到困惑。知名专家Jeffrey Richter曾表示这是微软的一个遗憾,因为它可能导致开发者的混乱。尽管如此,随着技术的发展,C#的语法特性已经变得更为强大,适应了不断变化的...
这不仅降低了应用程序的响应速度,而且可能会让用户感到困惑和不耐烦。 #### 解决方案——多线程技术的应用 为了改善这一状况,可以采用多线程技术来处理数据加载等耗时操作,确保用户界面始终保持活跃状态。苹果...
回到那个引起困惑的例子:`setTimeout(function() { while(true) {} }, 100)`和后续的`setTimeout`及`setInterval`。如果第一个`setTimeout`中的死循环没有被中断,那么后面的定时器和回调函数都将无法执行,因为...
这种情况下,用户可能会感到困惑和沮丧,因为他们无法确定程序是否仍在运行,或者是否需要重新启动程序。为了解决这个问题,多线程编程成为了一个重要的工具。在Windows窗体(WinForms)应用程序中,Microsoft为...
线程是程序执行的独立路径,理解线程间的同步和通信机制,如synchronized关键字、wait()、notify()方法,能够帮助开发者编写高效的多线程程序,应对现代计算环境的复杂需求。 总的来说,Java编程思想虽然初学时可能...
在描述中提到,有些易语言开发者可能对如何在多线程环境下进行拨号操作感到困惑,担心拨号过程会干扰到其他线程。解决这个问题的关键在于正确地管理和同步线程。一种常见的方法是使用线程同步机制,如互斥量、信号量...
然而,在实际编程过程中,有时候会出现一些令人困惑的情况。比如,如果在setTimeout中执行一个永远循环的操作,那么这个操作会阻塞后续的事件队列处理,导致后续的setTimeout和setInterval并不会按预期时间执行。这...
昨晚今晚写了两晚,总算把Py Port Scanner 写完了,姑且称之为0.1版本,算是一个Python多线程端口扫描工具。 水平有限,实话中间有一些困惑和不解的地方,代码可能也写的比较乱。有些问题并未找到很好的解决方法,还...