Hi,
I feel u try one another method to do this. That u can create a thread
in init, but don't there wait in init itself by
writing join, so that thread can die after making the connection and you can
continue then.
In doGet it's working because I think that itself is different thread , then
the main............
May this can help u..........
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Anil Kumar Phone (Work) 732-389-3295x630
UnixPros Inc. (home) 732-935-1590
10 Industrial Way East
Eatontown, NJ 07724
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Every body have a right to say anything, But some stupid take it for granted
----Original Message-----
From: Marc Saegesser [SMTP:[EMAIL PROTECTED]]
Sent: Thursday, August 17, 2000 6:23 PM
To: [EMAIL PROTECTED]
Subject: Thread synchronization problem in init()
I've encountered a very strange problem with thread synchronization
in code
executed by a servlet's init() method. I've included sample code
below.
Within my init() method I want to create an object that creates a
new thread
that will handle network communications. The main thread needs to
block
until the I/O thread notifies it that it has established a valid
connection.
I do this by creating an Object that the main thread waits on and
the I/O
thread notifies. The problem is that the I/O thread's run() method
does not
start executing until the main thread's wait() method times out. If
I move
this code from init() into doGet() it works fine.
I've used Threadalyzer to take a look at what's happening and it
appears
that the java.lang.Thread.run is blocked waiting to acquire
com.livesoftware.jrun.JRunServletLoader. This object is apparently
held
across the object.wait(). This prevents the run method from
starting until
the wait completes.
The example code is in three files. WaitTest.java creates the I/O
thread
and waits for it to notify objWait. The I/O thread is simulated by
calls to
Thread.sleep(). AppTest.java is a simple servlet that creates an
instance
of WaitTest inside init() and calls its connect method. What I see
in
stderr.log is that the messages from inside the run method don't get
displayed until after the objWait.wait() times out.
AppTest2.java simply moves the WaitTest code from init() to doGet().
When I
run this I see the messages that I'm entering the wait, followed by
the
run() method starting and then the object gets notified.
Am I doing something against the rules by creating threads inside
the init()
method? Is there any work around for this? Thanks.
----------- AppTest.java ------------------
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
*/
public class AppTest extends HttpServlet
{
private WaitTest conn = null;
public void init(ServletConfig config) throws
ServletException
{
super.init(config);
try{
conn = new WaitTest();
conn.connect();
}catch(Exception e){
System.err.println("AppTest.init: " +
e.toString());
}
}
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><body><h1>Blah</h1></body></html>");
}
public void destroy()
{
if(conn != null)
conn.disconnect();
}
}
--------------------------------------------
----------- AppTest2.java -----------------
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AppTest2 extends HttpServlet
{
private WaitTest conn = null;
public void init(ServletConfig config) throws
ServletException
{
super.init(config);
}
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException
{
try{
conn = new WaitTest();
conn.connect();
}catch(Exception e){
System.err.println("AppTest.init: " +
e.toString());
}
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><body><h1>Blah</h1></body></html>");
}
public void destroy()
{
if(conn != null)
conn.disconnect();
}
}
--------------------------------------------
----------- WaitTest.java -----------------
import java.io.*;
public class WaitTest implements Runnable
{
private Thread thrdReader;
private boolean bDisconnecting = false;
private int nTimeout = 15000;
private Object objWait = new Object();
public void connect()
{
try{
thrdReader = new Thread(this);
System.err.println("WaitTest.connect:
Starting reader thread.");
thrdReader.start();
try{
synchronized(objWait){
System.err.println("WaitTest.connect: Waiting for connection...");
objWait.wait(nTimeout);
System.err.println("WaitTest.connect: Wait returned.");
}
}catch(InterruptedException e){
System.err.println("WaitTest.connect: " + e.toString());
}
}catch(Exception e){
}
}
public void disconnect()
{
try{
bDisconnecting = true;
try{
thrdReader.join(30000);
}catch(InterruptedException e){
}
}catch(Exception e){
System.err.println("WaitTest.disconnect:
Caught exception. " +
e.toString());
}finally{
bDisconnecting = false;
}
}
public void run()
{
System.err.println("WaitTest.run: entered.");
while(!bDisconnecting){
try{
Thread.currentThread().sleep(5000);
synchronized(objWait){
objWait.notifyAll();
}
}catch(InterruptedException e){
}
}
System.err.println("WaitTest.run: leaving.");
}
}
--------------------------------------------
----------------------------------------------------------------------------
--
Archives: http://www.egroups.com/group/jrun-interest/
Unsubscribe:
http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/jrun_talk
or send a message to [EMAIL PROTECTED] with
'unsubscribe' in the body.
------------------------------------------------------------------------------
Archives: http://www.egroups.com/group/jrun-interest/
Unsubscribe: http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/jrun_talk
or send a message to [EMAIL PROTECTED] with 'unsubscribe' in the
body.