Geir Magnusson Jr wrote: > Don't we want to be able to tell if a thread is Blocked anyway?
Do you mean on a monitor (=yes) or in the OS? The VM may choose to do deadlock detection etc. but the classlib doesn't care. Regards, Tim > Tim Ellison wrote: >> I hadn't appreciated that the read call is blocking... >> >> So how about you do the blocking read() in a new thread, then the main >> thread can poll to wait until the reading thread's state is Blocked, >> before closing the channel and forcing the exception? >> >> The problem is that the thread will be detached from the VM and blocking >> in the OS for the read, so not officially Java Blocked. You can only >> determine OS blocked state via additional native code. >> >> Therefore, as Paulex wrote, if you are not writing additional native >> code for your test you may have to actually synchronize on the reading >> thread having passed begin(), not when it is actually read() blocked. >> >> Does that make sense? >> >> Regards, >> Tim >> >> Andrew Zhang wrote: >>> Hello Tim, >>> >>> Thank you for your suggestion. :) >>> >>> Of course, "fix" is the best choice. I also have tried to use >>> "wait/notify", >>> but found it didn't work for this case. >>> >>> Please note that "channel1.read(targetBuf); // Label 3" is a blocking >>> operation. And we want code at label 1,2 to execute after label 3. >>> >>> There is the question: >>> >>> Where should I put "notify"? >>> >>> 1. before "read"? NO. If nofity is put before read, then we still can't >>> guarantee "configureBlocking" is executed after read. >>> 2. after "read"? NO. read is a blocking operatoin. It will never be >>> executed >>> if put notify after read. >>> 3. in "read"? Obviously NO. >>> >>> Please correct me if I'm wrong. >>> >>> Thanks! >>> >>> >>> On 7/11/06, Tim Ellison <[EMAIL PROTECTED]> wrote: >>>> Andrew Zhang wrote: >>>>> Hello everybody, >>>>> >>>>> I noticed such tests in DatagramChannel, which is useful, but >>>> potentially >>>>> unstable. Consider: >>>>> >>>>> public void testReadWrite_configureBlock() throws Exception { >>>>> byte[] targetArray = new byte[2]; >>>>> // bind and connect >>>>> this.channel1.socket().bind(localAddr2); >>>>> this.channel1.connect(localAddr1); >>>>> this.channel2.socket().bind(localAddr1); >>>>> this.channel2.connect(localAddr2); >>>>> ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); >>>>> >>>>> new Thread() { >>>>> public void run() { >>>>> try { >>>>> Thread.sleep(TIME_UNIT); >>>>> channel1.configureBlocking(false); // Label 1 >>>>> channel1.close(); // Label 2 >>>>> } catch (Exception e) { >>>>> //ignore >>>>> } >>>>> } >>>>> }.start(); >>>>> try { >>>>> this.channel1.read(targetBuf); // Label 3 >>>>> fail("should throw AsynchronousCloseException"); >>>>> } catch (AsynchronousCloseException e) { >>>>> // ok >>>>> } >>>>> } >>>>> This test assumes Label 3 code should execute before Label 1 and Label >>>> 2, >>>>> which is right in most cases, because the code invokes "Thread.sleep >>>>> (TIME_UNIT)". >>>>> >>>>> However, it's potentially unstable. It heavily depends on TIME_UNIT >>>> value, >>>>> test environment (Hardware, OS ...) >>>> Urgh. There are *very* few occasions when you need to use >>>> Thread.sleep(); and 'thread synchronization' is definitely not one of >>>> them! >>>> >>>> If you have order dependencies between two or more threads then use >>>> wait/notify, or synchronized, and make them explicit. >>>> >>>> There are any number of books on multi-threaded programming in Java. >>>> >>>>> Indubitably, the test is very useful for testing >>>>> "AsynchronousCloseException" of DatagramChannel.read(ByteBuffer) >>>> method. >>>>> How shall we deal with such issue? Deleting such valuable tests is not >>>> a >>>>> wise decision, while keeping them may cause build system fail. >>>>> >>>>> One solution I could image is TestNG. :) i.e. Use "@dev" or >>>> something to >>>>> mark such tests, say, the tests are only for developing purpose. >>>>> >>>>> Any suggestions? >>>> Fix it! :-) >>>> >>>> Regards, >>>> Tim >>>> >>>> -- >>>> >>>> Tim Ellison ([EMAIL PROTECTED]) >>>> IBM Java technology centre, UK. >>>> >>>> --------------------------------------------------------------------- >>>> Terms of use : http://incubator.apache.org/harmony/mailing.html >>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>> >>>> > > > --------------------------------------------------------------------- > Terms of use : http://incubator.apache.org/harmony/mailing.html > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Tim Ellison ([EMAIL PROTECTED]) IBM Java technology centre, UK. --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]