http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?r1=1069292&r2=1135026&diff_format=h
здесь я вижу, что тайм-аут был добавлен в последнее время
убедитесь, что startTimeout> 0, иначе вы будете ждать (0) или ждать (-n) это вероятнопричина IllegalMonitorStateException
РЕДАКТИРОВАТЬ: ОК, выше, это катастрофа, но давайте попробуем это:
мы в конструкторе Mux: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup
строка 176 мысоздайте SocketChannelConnectionIO и передайте это после того, как мы сломаемся, и другой поток вступит во владение.
в конструкторе SocketChannelConnectionIO, определенном здесь: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?view=markup в строке 112 мы регистрируемся на канал с новым обработчиком ().
обработчик извлекает что-то на канал и функцию, скажем, функция handleReadReadyвыполнив, мы синхронизируемся на muxLock.
теперь мы все еще в конструкторе, поэтому объект в финале все еще изменчив !!!давайте предположим, что это изменится, теперь у нас есть что-то, ожидающее на другом muxLock
Один на миллион сценарий
РЕДАКТИРОВАТЬ
http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?revision=1135026&view=co
Mux(SocketChannel channel,
int role, int initialInboundRation, int maxFragmentSize)
throws IOException
{
this.role = role;
if ((initialInboundRation & ~0x00FFFF00) != 0) {
throw new IllegalArgumentException(
"illegal initial inbound ration: " +
toHexString(initialInboundRation));
}
this.initialInboundRation = initialInboundRation;
this.maxFragmentSize = maxFragmentSize;
//LINE BELOW IS CAUSING PROBLEM it passes this to SocketChannelConnectionIO
this.connectionIO = new SocketChannelConnectionIO(this, channel);
//Lets assume it stops here we are still in constructor
//and we are not in synchronized block
directBuffersUseful = true;
}
теперь в конструкторе SocketChannelConnectionIO http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?revision=1069292&view=co
SocketChannelConnectionIO(Mux mux, SocketChannel channel)
throws IOException
{
super(mux);
channel.configureBlocking(false);
this.channel = channel;
//Line below we are registering to the channel with mux that is still mutable
//this is the line that actually is causing the problem move that to
// start() and it should work
key = selectionManager.register(channel, new Handler());
}
переместить этот код в start () должно работать key = selectionManager.register(channel, new Handler());
(я предполагаю, что start это executet, когда мы хотим начать обработку)
/**
* Starts processing connection data.
*/
void start() throws IOException {
key = selectionManager.register(channel, new Handler());
key.renewInterestMask(SelectionKey.OP_READ);
}
Но было бы гораздо лучше не создавать SocketChannelConnectionIO в конструкторе mux, но, возможно, где-то после этого то же самое для второго конструктора, создающего StreamConnectionIO с этим