首先,问问题的人和回答问题的人应该都没有好好的仔细看书.书中已经明确地说到:
SelectableChannel的register(Selector selector, ...)和Selector的select()方法都会操作Selector对象的共享资源all-keys集合.
SelectableChannel及Selector的实现对操作共享资源的代码块进行了同步,从而避免了对共享资源的竞争.
同步机制使得一个线程执行SelectableChannel的register(Selector selctor, ...)时,
不允许另一个线程同时执行Selector的select()方法,反之亦然.
|
并且说明解释的也很清楚.
既然这么说了,那看完书中的代码之后就应该对其进行一些改造,这样才能更好的理解程序.
为了解答这里的问题,对例子稍微一些改动:
1.
2.
然后运行程序,这时候可以看到出现问题了:
查看问题出在何处,首先执行jps查看运行的程序的pid.接下来使用jstack命令.如下:
C:\Users\yangkun>jstack 10008
2013-10-27 15:37:16
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):
"Thread-0" prio=6 tid=0x000000000ac26800 nid=0x1dd8 waiting for monitor entry [0
x000000000b25f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at sun.nio.ch.SelectorImpl.register(Unknown Source)
- waiting to lock <0x00000000eb4b3cd8> (a java.util.Collections$Unmodifi
ableSet)
at java.nio.channels.spi.AbstractSelectableChannel.register(Unknown Sour
ce)
- locked <0x00000000eb4f2210> (a java.lang.Object)
at java.nio.channels.SelectableChannel.register(Unknown Source)
at tcp.selector.SelectorDeadLock.accept(SelectorDeadLock.java:47)
at tcp.selector.SelectorDeadLock$1.run(SelectorDeadLock.java:83)
"Service Thread" daemon prio=6 tid=0x0000000008fa8000 nid=0x2a4c runnable [0x000
0000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=10 tid=0x0000000008f9c000 nid=0x29b0 waiting on
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0x0000000008f9a000 nid=0x29ac waiting on
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x0000000008f99000 nid=0x29b4 waiting on co
ndition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x0000000008f92000 nid=0x2a48 runnable [0
x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x00000000025a6000 nid=0x2a40 in Object.wait() [0x
000000000a37f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000eb405798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x00000000eb405798> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
"Reference Handler" daemon prio=10 tid=0x000000000259f000 nid=0x2a3c in Object.w
ait() [0x000000000a1ef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000eb405320> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
- locked <0x00000000eb405320> (a java.lang.ref.Reference$Lock)
"main" prio=6 tid=0x000000000264c800 nid=0x25a8 runnable [0x000000000296e000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(Unknown Source)
at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x00000000eb4b3d58> (a sun.nio.ch.Util$2)
- locked <0x00000000eb4b3cd8> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000000eb4b3768> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at tcp.selector.SelectorDeadLock.service(SelectorDeadLock.java:62)
at tcp.selector.SelectorDeadLock.main(SelectorDeadLock.java:89)
"VM Thread" prio=10 tid=0x0000000008ef2800 nid=0x2a38 runnable
"GC task thread#0 (ParallelGC)" prio=6 tid=0x00000000024f3000 nid=0x2144 runnabl
e
"GC task thread#1 (ParallelGC)" prio=6 tid=0x00000000024f5000 nid=0x2344 runnabl
e
"GC task thread#2 (ParallelGC)" prio=6 tid=0x00000000024f6800 nid=0x2318 runnabl
e
"GC task thread#3 (ParallelGC)" prio=6 tid=0x00000000024f8800 nid=0x22c4 runnabl
e
"VM Periodic Task Thread" prio=10 tid=0x0000000008fb1800 nid=0x249c waiting on c
ondition
JNI global references: 125
|
程序会一致阻塞而无法继续执行.
相关推荐
在多线程并发场景下,为了保证线程安全,可能需要使用`synchronized`关键字或者`Lock`来同步对共享资源的访问,防止数据竞争问题。 在给定的文件名称列表中,`.classpath`、`MANIFEST.MF`、`.project`、`.settings`...
通过深入学习和理解Selector机制,开发者可以有效地设计和实现高性能的服务器应用,比如网络服务器、聊天服务器等,充分利用系统资源,提高并发处理能力。结合实际项目需求,合理运用Java NIO的Selector机制,可以...
本文将深入探讨如何通过自定义Selector实现在RocketMQ中进行消息通道定向的发送和拉取。 在RocketMQ中,Selector是用于过滤和选择消息的关键组件,它允许消费者根据特定的条件从队列中选择要消费的消息。默认的...
本教程将深入探讨Android中的Selector及其使用方法,通过一个完整的Demo来帮助你理解和掌握这个核心概念。 首先,我们需要了解Selector的基本结构。一个Selector通常是一个XML文件,位于项目的res/drawable目录下。...
为了实现美观且交互丰富的按钮,我们可以使用Selector来定义按钮在不同状态下的背景和字体颜色。Selector是Android中的一种状态列表资源,它可以为控件在不同状态(如按下、默认、聚焦等)下显示不同的效果。 标题...
playwright-query-selector-all方法详解
在Android开发中,Selector和Shape是两种非常重要的资源文件,它们在UI设计和交互中扮演着关键角色。Selector主要用于实现视图(如按钮、文本框等)的状态改变时的样式切换,而Shape则用于定义自定义形状,如矩形、...
- **选择事件**:一旦通道被注册,我们就可以调用Selector的`select()`或`select(long timeout)`方法来等待和获取已经准备好的事件。这些事件被封装在SelectionKey对象中。 - **处理事件**:从Selector返回的迭代...
- **Selector的select方法**:此方法会阻塞,直到至少有一个通道已准备好处理某种类型的I/O操作。返回值表示准备好的通道数量。 - **Selector的selectedKeys方法**:返回一个`Set`,其中包含了所有准备好的`...
"iconFont 实现selector的Demo" 提供了一种有效的方法,通过使用阿里巴巴的iconfont技术来减少APK的大小,同时还能实现selector状态的动态变化。下面我们将详细探讨这些知识点。 首先,**iconfont** 是一种将图标...
在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...
然后调用`channel.register(selector, interestOps)`方法将通道注册到Selector上,其中`interestOps`是想要监听的事件类型,如OP_READ、OP_WRITE和OP_CONNECT等。 以下是一个简单的Java NIO客户端示例,名为...
在Laravel框架中,开发一个名为"selector"的组件,我们可以深入理解其背后的原理和应用场景。选择器模式(Selector Pattern)是一种设计模式,它允许在运行时动态地选择算法或行为,提供了一种灵活的方式来应对多态...
在Android开发中,Drawable是用于绘制图形的一种资源,它可以是颜色、位图或者是一些复杂的图形状态,如按钮按下、悬停等不同状态的效果。Selector是Drawable的一种特殊类型,它可以根据控件的状态来改变其显示的...
4. **处理就绪的Channel**:`select()`方法返回后,我们可以获取就绪的`SelectionKey`集合,并对每个就绪的Channel进行相应的操作。 ```java Set<SelectionKey> selectedKeysSet = selector.selectedKeys(); ...
在simulink上进行BusCreator和BusSelector的简单实验
Selector的使用大大提升了Java程序处理并发I/O的能力,因为它允许单个线程同时处理多个连接,而不是为每个连接创建一个新的线程,从而降低了资源消耗和上下文切换的开销。理解并熟练使用Selector是掌握Java NIO的...
本教程将详细介绍如何使用Selector来设置Button在可用和不可用状态下的样式,以提高应用的视觉效果和交互性。 Selector在Android中是一种基于状态的选择器,它可以为不同状态下的View定义不同的样式。它允许开发者...
通过对`select`和`epoll`的测试结果进行比较,可以直观地看到哪种方法在特定场景下更优。 实验报告`epoll和select实现多路复用.docx`应该详细记录了实验的步骤、代码实现、测试过程以及分析结果。通过阅读报告,你...
2. **选择机制**:调用 `select()` 方法时,Selector 会阻塞等待直至至少有一个 Channel 变为就绪状态。期间,Selector 不断监控所有注册的 Channel。 3. **处理机制**:处理就绪的 Channel 时,通过 `SelectionKey`...