JavaComm Problem - PortInUse

Hi all,
I've got some troubles using the JavaComm API. I'm accessing a hardware device connected with USB. A virtual port is provided which can be accessed identically as a serial port. Communication works fine. However, when I break the connection (by separating the plug from the port), I get an Error "Port currently owned by Unknown Windows Application" next time I'd like to establish a connection. Even if I close my application the port isn't released and a reboot is necessary.
Does anyone has an idea? Thanks in advance!

i have a similar problem but only when using a usb-serial convertor cable. when i close the port - the operating system does not release the com port. next time i try to connect i get the PortInUse exception. did you manage to solve this problem?

Similar Messages

  • Javacomm: problem with the receive data

    Hello to all,
    I have a problem on receiving data from a serial port.
    As I figured out The port is obtained by the program I post
    here bellow..but I can't receive data.
    Do you have any hints?
    Thanks in advance.
    Mandy
    import javax.comm.*;
    import java.io.*;
    public class SerialRead extends Thread implements SerialPortEventListener
         private InputStream in;
         public SerialRead(String port)
              try
                   CommPortIdentifier id_porta;
                   id_porta = CommPortIdentifier.getPortIdentifier(port);
                   CommPort porta = id_porta.open("Read from serial porta", 200);
                   in = porta.getInputStream();
                   SerialPort porta_seriale = (SerialPort)porta;
                   porta_seriale.setSerialPortParams(9600, SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                   porta_seriale.addEventListener(this);
                   this.start();
              catch (NoSuchPortException ne)
                   System.out.println("The port " + port + "is not  present");
              catch (PortInUseException pe)
                   System.out.println("The port " + port + "is used by " + pe.
                        currentOwner);
              catch (UnsupportedCommOperationException ue)
                   System.out.println(
                        "The porta does not support the properties defined");
              catch (java.util.TooManyListenersException tme)
                   System.out.println(
                        "Ther can be only one owner of the port");
              catch (IOException ioe)
                   System.out.println("Error ofi IO");
         public void run()
              try
                   Thread.sleep(10000);
              catch (InterruptedException e)
         public void serialEvent(SerialPortEvent event)
              System.out.println("1");
             switch ( event.getEventType() )
                   case SerialPortEvent.BI :
                   case SerialPortEvent.OE :
                   case SerialPortEvent.FE :
                   case SerialPortEvent.PE :
                   case SerialPortEvent.CD :
                   case SerialPortEvent.CTS :
                   case SerialPortEvent.DSR :
                   case SerialPortEvent.RI :
                   case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
                        break;
                   case SerialPortEvent.DATA_AVAILABLE :
                        byte[] readBuffer = new byte[20];
                        try
                             while ( in.available() > 0 )
                                  int numBytes = in.read(readBuffer);
                             System.out.println(new String(readBuffer));
                        catch (IOException e)
                        break;
         public static void main(String[] args)
             System.out.println(args[0]);
             if ( args.length < 1 )
                   System.out.println("Use java SerialRead <port name>");
              else
                   SerialRead reading = new SerialRead(args[0]);
    }

    Hi Abdul,
    Check if the data you are getting for the two fields in your data loading are correct. I think it has some illegal characters(I guess it has a trailing space). If possible try and correct it in the source system itself.
    If you are doing full load for the master data, everytime the system is going to pull these values in and throw error. One other way of avoiding it will be to maintain routines to eliminate these.
    The quickfix will be to correct it at the PSA level and load it again.
    Regards.

  • Javacomm read/write problem

    Hello all, i have successfully installed javacomm package in my computer and i can enumerate all available ports. My problem is between the read - write communication. By running the SimpleRead first and then the SimpleWrite i got a "Port Already in use" which sounds normal to me, so i connected 2 pc's with a serial cable and runned one of sun's samples on each.
    Step 1. SimpleRead waits for data on COM1
    Step 2. SimpleWrite(on other pc) sends some data from COM1
    Both COM1's are connected with that serial cable but seems no data coming. Am i doing something wrong? I tried same thing with VirtualPC but still no data arriving.
    Any help appreciated. Thanks

    Hello all, i have successfully installed javacomm
    package in my computer and i can enumerate all
    available ports. My problem is between the read -
    write communication. By running the SimpleRead first
    and then the SimpleWrite i got a "Port Already in
    use" which sounds normal to me, so i connected 2 pc's
    with a serial cable and runned one of sun's samplesAre you using a terminal the opens the port?
    Without any ambiguity whatsoever,
    "Port Already in use" means
    something else has already opened the com port and I can say the
    COMM API. works because I use it all the time with GPRS board.
    ie:
    https://hyperview.dev.java.net/source/browse/hyperview/www/comm/SerialHandler.java?rev=1.2&view=markup
    Crossing pins 2 & 3 will only redirect your output/input
    but will not cause the the port to be in use Jos.
    (T)

  • Problema whit JavaComm and RxTX

    Hi,
    I have a problem with this API under linux.
    When I insert my device USB<->serial on Debian, I find this one on /dev/ttyAMC0 (and with hyperterminal is ok) but when, with java, I cicle port, I find only /dev/ttyS0 and not my port.
    I have tried this:
    CommPortIdentifier portId1 = CommPortIdentifier.getPortIdentifier("/dev/ttyACM0");
    +               try {+
    +                    SerialPort serialPort1 = (SerialPort) portId1.open("ComControl", 2000);+
    but error found:
    gnu.io.NoSuchPortException
    Should I use CommPortIdentifier.addPortName()??? How can I do?
    Thanks.

    Thx, I tried to read, but I have not found anything that relates to the inclusion of a port that is not found automatically by API

  • I've a parallel port problem.Can anyone help me?

    Hi everybody I've a problem about programming with parallel port.I tried to write a simple byte data likes "0x0D" through the OutputStream of parallel port "LPT1" but it didn't get out from the runtime process;I 've found that it has stuck at OutputStream.write(0x0D); when i 've debugged it. Do you guys have any clues? and How can i make it through.

    Maybe take a look at this:
    http://java.sun.com/products/javacomm/javadocs/index.html

  • I need the ibm-javacomm-win32-x86.zip, badly, asap

    guys can anyone tell me where i can download the ibm-javacomm-win32-x86.zip, i really need it asap,
    i need it because im using java.comm api with an applet and due to incompatibilities it is not working..
    they said that ibm-javacomm-win32-x86.zip will solve this problem
    but as of now the website where i can download it is not working..
    can anyone help me find it
    or if anyone has the file can somebody just email it to me
    here is my email add..
    [email protected]
    tnx.

    ftp://ftp.software.ibm.com/software/retail/poseng/jpos/ibm-javacomm-win32-x86.zip
    Is that what you're looking for? If so, I found it by googling ibm-javacomm-win32-x86.zip:
    http://www.google.com/search?q=ibm-javacomm-win32-x86.zip
    The first hit was a thread on ibm's site, and the last post linked to this: http://www-1.ibm.com/support/docview.wss?uid=pos1R1001497, which had the link to the zip towards the bottom.
    Took all of 3 minutes total, probably less time than it took to post this thread.

  • Javacomm doubt

    Hi all!!
    I'm programming a communication module with javacomm. My module is embeded in a big class as a method. I have a problem when I try to read from the serial port and there's nothing connected, there are no data. In that moment the program failt and get blocked. I don't know how to do to avoid this problem.
    I think a solution will be to put a SerialEventListener but I don't know how it work. I mean, I think it has to be defined as a new method, when there are data in the port, as I have notifyOnDataAvailable(true), an event occurs and then if I have the EventListener the event is treated and I can read. But, when the read has finished, the program will continue from the instruction that was executing when the event occur?
    I don't know if someone has undestood my problem, because is a bit hard for me to explain it in english and without showing the code, but I'd be very glad if someone could help me.
    Thank's a lot
    Gio-butterman

    I'm programming a communication module with javacomm. My module is
    embeded in a big class as a method. I have a problem when I try to read from
    the serial port and there's nothing connected, there are no data. In that moment
    the program failt and get blocked. I don't know how to do to avoid this problem.Set a line timeout when you open the serial port; something like this:serialPort= (SerialPort)portId.open(APPLICATION_NAME, TIME_OUT);If, after TIME_OUT milliseconds nothing has been returned, the read will
    timeout and return a -1 value. Check the API docs.
    kind regards,
    Jos

  • Javacomm serial port created after JVM started

    Hello all,
    I am playing with bluetooth and Java for a project and have run into a brick wall.
    My bluetooth adaptor (USB) uses rfcomm to create a virtual serial port to my phone.
    After exhaustive searching, I have not been able to find a Java API for a usb bluetooth dongle that will do this so I am having to use Runtime.exec to shell the program that will create the connection.
    The device that is created is /dev/rfcomm0, and I have created a symlink from /dev/ttyS1 to this so JavaComm can see this as /dev/rfcomm0 is not considered valid (I only have one com port in my PC so ttyS1 does not normally exist).
    When Java is started, /dev/ttyS1 does not exist (using the javacom to access it throws a NoSuchPortException) - this is expected. The problem is once the port is created, I still get the same exception. I can confirm that the port has been created sucessfully as minicom is able to communicate with the phone.
    I have tried putting the javacomm code in a new class, and creating a new instance of this class once the port does exist, but this does not work. I have also used the enumerator to check all ports that are known and /dev/ttyS1 does not appear in the list.
    If i run the command to create the port in a console before starting java then everything works althought this is obviously not acceptable as a final solution.
    Does anyone have any thoughts / suggestions what might help fix this?
    Cheers,
    -Jeff

    Morning,
    don't try to get the JavaComm class loaded before the rfcomm process has finished.Unfortunatly the rfcomm process will not terminate whilst the port is open, which makes things much harder.
    Here are some code snippets, the connect method is called as soon as I start my java program. It starts a thread which invokes the rfcomm commands. If the process terminates immediatly (p.waitFor() only waits a moment) then the connection has not been made, and runState is set to -1 which terminates the while loop in connect() and returns false.
    If the connection is made sucessfully, the process doesn't terminate, so the only way for the connect() method to return is if validPort returns true.
    The portListener class is the only one that uses javax.comm, and each time I call it I create a new instance - which I presume would re-scan for avaliable serial ports.
    If the serial port is not avaliable, an exception is thrown, so it returns false, if no exception is thrown it returns true.
    BTDevice.java
    public boolean connect(String addr)
    runState = 0;
    address = addr;
    start();
    while (runState == 0)
    if ((pl = new PortListener(serialPort)).validPort())
    runState = 1;
    return runState == 1;
    public void run()
    String s="";
    try
    p = Runtime.getRuntime().exec("/usr/bin/rfcomm connect rfcomm0 " + address);
    p.waitFor();
    catch (Exception e){}
    runState = -1;
    PortListener.java
    public boolean validPort()
    try
    CommPortIdentifier.getPortIdentifier(serialPort);
    return true;
    catch (Exception e)
    return false;
    Unfortunatly this does not happen, and even once the connection is made, validPort still returns false, as a NoSuchPort exception is thrown.
    However, if I put in a Thread.sleep(60000); between the start() and while (...) in connect() - so the first time an instance of PortListener is created the port does definatly exist - everything is fine.
    This must mean that as soon as javax.comm is initialised for the first time within a JVM, it stores all the known ports etc. so any other time it is used (even within a new instance of a class) it uses what it found out the first time and doesn't scan for new ports.
    I do not want to leave in Thread.sleep(...) as the connection time can vary, if the phone is set to auto-connect it takes 2-3 seconds, if it isn't it can take 15 seconds before the user looks at the phone.
    Any thoughts on how to make it re-scan for avaliable ports?
    Cheers,
    -Jeff

  • Javacomm under XP

    Hi !
    I have an issue with javacomm under xp( it works well under 2000) ? Did anybody have an idea of the problem ? Is it an installation issue : for example, comm.jar in jre/lib/ext, win32comm.dll in jre/bin, javax.comm.properties in jre/lib
    Thank you,
    Laurent

    I have experienced this many times.
    What anti-virus solution are you running in Windows?
    Users have experienced crashes and blue screens of death from Norton products. Norton has resolved these issues in their 2009 product line. I would only recommend Norton 2009 products, Kaspersky, and AVG for anti-virus solutions.
    I have noted a link, with further information, for you to check out.
    http://discussions.apple.com/thread.jspa?threadID=1587773&start=0&tstart=0
    Have you formatted your Windows partition as NTFS, or has it been formatted as Fat 32?
    Fat 32 will not handle file sizes of 3.5 GB or larger, and, overall, it seems to always cause issues.
    Have you tried a SMC reset?
    http://support.apple.com/kb/HT1411
    Good luck, and let us know!

  • A problem with threads

    I am trying to implement some kind of a server listening for requests. The listener part of the app, is a daemon thread that listens for connections and instantiates a handling daemon thread once it gets some. However, my problem is that i must be able to kill the listening thread at the user's will (say via a sto button). I have done this via the Sun's proposed way, by testing a boolean flag in the loop, which is set to false when i wish to kill the thread. The problem with this thing is the following...
    Once the thread starts excecuting, it will test the flag, find it true and enter the loop. At some point it will LOCK on the server socket waiting for connection. Unless some client actually connects, it will keep on listening indefinatelly whithought ever bothering to check for the flag again (no matter how many times you set the damn thing to false).
    My question is this: Is there any real, non-theoretical, applied way to stop thread in java safely?
    Thank you in advance,
    Lefty

    This was one solution from the socket programming forum, have you tried this??
    public Thread MyThread extends Thread{
         boolean active = true;          
         public void run(){
              ss.setSoTimeout(90);               
              while (active){                   
                   try{                       
                        serverSocket = ss.accept();
                   catch (SocketTimeoutException ste){
                   // do nothing                   
         // interrupt thread           
         public void deactivate(){               
              active = false;
              // you gotta sleep for a time longer than the               
              // accept() timeout to make sure that timeout is finished.               
              try{
                   sleep(91);               
              }catch (InterruptedException ie){            
              interrupt();
    }

  • A problem with Threads and MMapi

    I am tring to execute a class based on Game canvas.
    The problem begin when I try to Play both a MIDI tone and to run an infinit Thread loop.
    The MIDI tone "Stammers".
    How to over come the problem?
    Thanks in advance
    Kobi
    See Code example below:
    import java.io.IOException;
    import java.io.InputStream;
    import javax.microedition.lcdui.Graphics;
    import javax.microedition.lcdui.Image;
    import javax.microedition.lcdui.game.GameCanvas;
    import javax.microedition.media.Manager;
    import javax.microedition.media.MediaException;
    import javax.microedition.media.Player;
    public class MainScreenCanvas extends GameCanvas implements Runnable {
         private MainMIDlet parent;
         private boolean mTrucking = false;
         Image imgBackgound = null;
         int imgBackgoundX = 0, imgBackgoundY = 0;
         Player player;
         public MainScreenCanvas(MainMIDlet parent)
              super(true);
              this.parent = parent;
              try
                   imgBackgound = Image.createImage("/images/area03_bkg0.png");
                   imgBackgoundX = this.getWidth() - imgBackgound.getWidth();
                   imgBackgoundY = this.getHeight() - imgBackgound.getHeight();
              catch(Exception e)
                   System.out.println(e.getMessage());
          * starts thread
         public void start()
              mTrucking = true;
              Thread t = new Thread(this);
              t.start();
          * stops thread
         public void stop()
              mTrucking = false;
         public void play()
              try
                   InputStream is = getClass().getResourceAsStream("/sounds/scale.mid");
                   player = Manager.createPlayer(is, "audio/midi");
                   player.setLoopCount(-1);
                   player.prefetch();
                   player.start();
              catch(Exception e)
                   System.out.println(e.getMessage());
         public void run()
              Graphics g = getGraphics();
              play();
              while (true)
                   tick();
                   input();
                   render(g);
          * responsible for object movements
         private void tick()
          * response to key input
         private void input()
              int keyStates = getKeyStates();
              if ((keyStates & LEFT_PRESSED) != 0)
                   imgBackgoundX++;
                   if (imgBackgoundX > 0)
                        imgBackgoundX = 0;
              if ((keyStates & RIGHT_PRESSED) != 0)
                   imgBackgoundX--;
                   if (imgBackgoundX < this.getWidth() - imgBackgound.getWidth())
                        imgBackgoundX = this.getWidth() - imgBackgound.getWidth();
          * Responsible for the drawing
          * @param g
         private void render(Graphics g)
              g.drawImage(imgBackgound, imgBackgoundX, imgBackgoundY, Graphics.TOP | Graphics.LEFT);
              this.flushGraphics();
    }

    You can also try to provide a greater Priority to your player thread so that it gains the CPU time when ever it needs it and don't harm the playback.
    However a loop in a Thread and that to an infinite loop is one kind of very bad programming, 'cuz the loop eats up most of your CPU time which in turn adds up more delays of the execution of other tasks (just as in your case it is the playback). By witting codes bit efficiently and planning out the architectural execution flow of the app before start writing the code helps solve these kind of issues.
    You can go through [this simple tutorial|http://oreilly.com/catalog/expjava/excerpt/index.html] about Basics of Java and Threads to know more about threads.
    Regds,
    SD
    N.B. And yes there are more articles and tutorials available but much of them targets the Java SE / EE, but if you want to read them here is [another great one straight from SUN|http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html] .
    Edited by: find_suvro@SDN on 7 Nov, 2008 12:00 PM

  • J2ME problem with threads

    Hi all,
    I would like to ask you for a help. I need to write a small program at my university. I started to write a midlet which function would be to countdown time for sports activities. I woul like to start a new thread - the one that counts down - and at the same time make the main thread sleep. After the "countdown" thread finishes, the main thread wakes up and waits for user input. The problem is that when the "countdown" thread finishes his work, I've got Uncaught exception java/lang/NullPointerException. error and the midlet halts.
    Below you can find the code
    import java.lang.*;
    import java.util.*;
    import javax.microedition.lcdui.*;
    import javax.microedition.midlet.*;
    public class intervals extends MIDlet implements CommandListener
    public Display ekran;
    private SweepCanvas sweeper;
    private Form rundy;
    private TextField round0, round1, round2, round3, round4, round5, round6, round7, round8;
    private long czas,x;
    private Command exitCommand;
    private Command addRound;
    private Command delRound;
    private Command start;
    private TextField repeat;
    private Form odliczanie;
    private Alert ostrz;
    Licznik thread;
    String test;
    StringItem test1;
    int parz,i,j,k;
    static int l;
    int ilrund;
    int ilpowt;
    Item sec;
    long sec1;
    public intervals()
        rundy = new Form("Interwa&#322;y sportowe");
        exitCommand = new Command("Wyj&#347;cie", Command.EXIT, 2);
        addRound = new Command("Dodaj","Dodaj rund&#281;", Command.ITEM,1);
        delRound = new Command("Usu&#324;","Usu&#324; ostatni&#261; rund&#281;", Command.ITEM,1);
        start = new Command("Start", Command.ITEM,1);
        odliczanie = new Form("Odliczanie");
        TextField dodaj(TextField kolej)
            kolej=new TextField("Podaj czas (s) rundy "+parz,null, 4, TextField.NUMERIC);//stworzenie nowej instancji do wybierania czasu trwania rundy
            if(rundy.size()==0)
                rundy.insert(rundy.size(),kolej);
                else
                    rundy.insert(rundy.size()-1, kolej);
            return kolej;
        void odliczanie(TextField round)
            monitor m=new monitor();
            k=Integer.parseInt(round.getString());
            ekran.setCurrent(odliczanie);
            thread=new Licznik(k,odliczanie);
            thread.start();
            ekran.setCurrent(rundy);
    public void startApp()// throws MIDletStateChangeException
        rundy.deleteAll();
        repeat = new TextField("Podaj ilo&#347;&#263; powtórze&#324;",null,1,TextField.NUMERIC);
        rundy.addCommand(addRound);
        rundy.addCommand(exitCommand);
        rundy.setCommandListener(this);
        Canvas obrazek = new MyCanvas();
        ekran = Display.getDisplay(this);
        ekran.setCurrent(obrazek);
        czas=System.currentTimeMillis();
        while (System.currentTimeMillis()<czas+1000)
            continue;
        ekran.setCurrent(rundy);
    public void pauseApp()
    public void destroyApp(boolean unconditional)
        notifyDestroyed();
    public void commandAction(Command c, Displayable s)
        if (c == exitCommand)
            destroyApp(false);
            notifyDestroyed();
        else if(c==addRound)
            if(rundy.size()==0)//Sprawdzenie ilo&#347;ci elementów w celu poprawnego wy&#347;wietlania liczby rund w formie
                parz=1;
                else
                parz=rundy.size();
            switch(parz)
                case 1:
                    round0=dodaj(round0);break;
                case 2:
                    round1=dodaj(round1);break;
                case 3:
                   round2= dodaj(round2);break;
                case 4:
                    round3=dodaj(round3);break;
                case 5:
                    round4=dodaj(round4);break;
                default:
                    ostrz=new Alert("Uwaga","Maksymalna liczba rund wynosi 9", null, AlertType.INFO);
                    ostrz.setTimeout(3000);
                    ekran.setCurrent(ostrz);
            if(rundy.size()==1)
                rundy.append(repeat);
                rundy.addCommand(start);
            rundy.addCommand(delRound);
        else if(c==delRound)
            if(rundy.size()!=0)
                rundy.delete(rundy.size()-2);
                if (rundy.size()==1)
                    rundy.deleteAll();
                if(rundy.size()==0)
                    rundy.removeCommand(delRound);
                    rundy.removeCommand(start);
        else if(c==start)
            ilrund=rundy.size()-1;
            if(this.repeat.size()>0)
                ilpowt=Integer.parseInt(this.repeat.getString());
            ekran = Display.getDisplay(this);
            for (i=1; i<=ilpowt;i++)
                odliczanie= new Form("Odliczanie");
                 for (j=0;j<ilrund;j++)
                    switch(j)
                         case 0:
                             odliczanie(round0);
                             break;
                         case 1:
                             odliczanie(round1);
                             break;
                         case 2:
                             odliczanie(round2);
                             break;
                         case 3:
                             odliczanie(round3);
                             break;
                         case 4:
                             odliczanie(round4);
                             break;
                         case 5:
                             odliczanie(round5);
                             break;
                         case 6:
                             odliczanie(round6);
                             break;
                         case 7:
                             odliczanie(round7);
                             break;
                         case 8:
                             odliczanie(round8);
                             break;
    class Licznik extends Thread
        int czas1,k;
        Form forma;
        monitor m;
        public Licznik(int k,Form formap)
            czas1=k;
            forma=formap;
        public synchronized void run()
            while(czas1>0)
                forma.deleteAll();
                forma.append("Czas pozosta&#322;y (s): "+czas1);
                try{Thread.sleep(1000);} catch(InterruptedException e){e.printStackTrace();}
                czas1--;
            if(czas1<=0)
                m.put();
        }and monitor class
    public class monitor
    boolean busy=false;
    synchronized void get()
        if(!busy)
            try
                wait();
            }catch(InterruptedException e){e.printStackTrace();}
        notify();
    synchronized void put()
        if(busy)
            try
            wait();
            }catch(InterruptedException e){e.printStackTrace();}
        busy=true;
        notify();
    }Can anybody help me with this?

    Groovemaker,
    Your Licznik class has a member m of type monitor, which has not been instantiated (in other words is null) hence, when calling m.put() you get NullPointerException. Please also mind, that using Thread.sleep(1000) is not an accurate way of measuring time.
    If I may, please use recommended for Java class naming conventions - some of your names use lower case, while other don't which is confusing to the reader.
    Daniel

  • Problem with threads within applet

    Hello,
    I got an applet, inside this applet I have a singleton, inside this singleton I have a thread.
    this thread is running in endless loop.
    he is doing something and go to sleep on and on.
    the problem is,
    when I refresh my IE6 browser I see more than 1 thread.
    for debug matter, I did the following things:
    inside the thread, sysout every time he goes to sleep.
    sysout in the singleton constructor.
    sysout in the singleton destructor.
    the output goes like this:
    when refresh the page, the singleton constructor loading but not every refresh, sometimes I see the constructor output and sometimes I dont.
    The thread inside the singleton is giving me the same output, sometime I see more than one thread at a time and sometimes I dont.
    The destructor never works (no output there).
    I don't understand what is going on.
    someone can please shed some light?
    thanks.
    btw. I am working with JRE 1.1
    this is very old and big applet and I can't convert it to something new.

    Ooops. sorry!
    I did.
         public void start() {
         public void stop() {
         public void destroy() {
              try {
                   resetAll();
                   Configuration.closeConnection();
                   QuoteItem.closeConnection();
              } finally {
                   try {
                        super.finalize();
                   } catch (Throwable e) {
                        e.printStackTrace();
         }

  • Problem with Threads and a static variable

    I have a problem with the code below. I am yet to make sure that I understand the problem. Correct me if I am wrong please.
    Code functionality:
    A timer calls SetState every second. It sets the state and sets boolean variable "changed" to true. Then notifies a main process thread to check if the state changed to send a message.
    The problem as far I understand is:
    Assume the timer Thread calls SetState twice before the main process Thread runs. As a result, "changed" is set to true twice. However, since the main process is blocked twice during the two calls to SetState, when it runs it would have the two SetState timer threads blocked on its synchronized body. It will pass the first one, send the message and set "changed" to false since it was true. Now, it will pass the second thread, but here is the problem, "changed" is already set to false. As a result, it won't send the message even though it is supposed to.
    Would you please let me know if my understanding is correct? If so, what would you propose to resolve the problem? Should I call wait some other or should I notify in a different way?
    Thanks,
    B.D.
    Code:
    private static volatile boolean bChanged = false;
    private static Thread objMainProcess;
       protected static void Init(){
            objMainProcess = new Thread() {
                public void run() {
                    while( objMainProcess == Thread.currentThread() ) {
                       GetState();
            objMainProcess.setDaemon( true );
            objMainProcess.start();
        public static void initStatusTimer(){
            if(objTimer == null)
                 objTimer = new javax.swing.Timer( 1000, new java.awt.event.ActionListener(){
                    public void actionPerformed( java.awt.event.ActionEvent evt){
                              SetState();
        private static void SetState(){
            if( objMainProcess == null ) return;
            synchronized( objMainProcess ) {
                bChanged = true;
                try{
                    objMainProcess.notify();
                }catch( IllegalMonitorStateException e ) {}
        private static boolean GetState() {
            if( objMainProcess == null ) return false;
            synchronized( objMainProcess ) {
                if( bChanged) {
                    SendMessage();
                    bChanged = false;
                    return true;
                try {
                    objMainProcess.wait();
                }catch( InterruptedException e ) {}
                return false;
        }

    Thanks DrClap for your reply. Everything you said is right. It is not easy to make them alternate since SetState() could be called from different places where the state could be anything else but a status message. Like a GREETING message for example. It is a handshaking message but not a status message.
    Again as you said, There is a reason I can't call sendMessage() inside setState().
    The only way I was able to do it is by having a counter of the number of notifies that have been called. Every time notify() is called a counter is incremented. Now instead of just checking if "changed" flag is true, I also check if notify counter is greater than zero. If both true, I send the message. If "changed" flag is false, I check again if the notify counter is greater than zero, I send the message. This way it works, but it is kind of a patch than a good design fix. I am yet to find a good solution.
    Thanks,
    B.D.

  • Problem with threads running javaw

    Hi,
    Having a problem with multi thread programming using client server sockets. The program works find when starting the the application in a console using java muti.java , but when using javaw multi.java the program doesnt die and have to kill it in the task manager. The program doesnt display any of my gui error messages either when the server disconnect the client. all works find in a console. any advice on this as I havent been able to understand why this is happening? any comment would be appreciated.
    troy.

    troy,
    Try and post a minimum code sample of your app which
    does not work.
    When using javaw, make sure you redirect the standard
    error and standard output streams to file.
    Graeme.Hi Graeme,
    I dont understand what you mean by redirection to file? some of my code below.
    The code works fine under a console, code is supposed to exit when the client (the other server )disconnects. the problem is that but the clientworker side of the code still works. which under console it doesnt.
    public class Server{
    ServerSocket aServerSocket;
    Socket dianosticsSocket;
    Socket nPortExpress;
    ClientListener aClientListener;
    LinkedList queue = new LinkedList();
    int port = 0;
    int clientPort = 0;
    String clientName = null;
    boolean serverAlive = true;
    * Server constructor generates a server
    * Socket and then starts a client threads.
    * @param aPort      socket port of local machine.
    public Server(int aPort, String aClientName, int aClientPort){
    port = aPort;
    clientName = aClientName;
    clientPort = aClientPort;
    try{
    // create a new thread
    aServerSocket = new ServerSocket(port) ;
    // connect to the nPortExpress
    aClientListener = new ClientListener(InetAddress.getByName(clientName), clientPort, queue,this);
    // aClientListener.setDaemon(true);
    aClientListener.start();
    // start a dianostic port
    DiagnosticsServer aDiagnosticsServer = new DiagnosticsServer(port,queue,aClientListener);
    // System.out.println("Server is running on port " + port + "...");
    // System.out.println("Connect to nPort");
    catch(Exception e)
    // System.out.println("ERROR: Server port " + port + " not available");
    JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Server port " + port + " not available", JOptionPane.ERROR_MESSAGE);
    serverAlive = false;
    System.exit(1);
    while(serverAlive&&aClientListener.hostSocket.isConnected()){
    try{
    // connect the client
    Socket aClient = aServerSocket.accept();
    //System.out.println("open client connection");
    //System.out.println("client local: "+ aClient.getLocalAddress().toString());
    // System.out.println("client localport: "+ aClient.getLocalPort());
    // System.out.println("client : "+ aClient.getInetAddress().toString());
    // System.out.println("client port: "+ aClient.getLocalPort());
    // make a new client thread
    ClientWorker clientThread = new ClientWorker(aClient, queue, aClientListener, false);
    // start thread
    clientThread.start();
    catch(Exception e)
    //System.out.println("ERROR: Client connection failure");
    JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Client connection failure", JOptionPane.ERROR_MESSAGE);
    }// end while
    } // end constructor Server
    void serverExit(){
         JOptionPane.showMessageDialog(null, "Server ","ERROR: nPort Failure", JOptionPane.ERROR_MESSAGE);
         System.exit(1);
    }// end class Server
    *** connect to another server
    public class ClientListener extends Thread{
    InetAddress hostName;
    int hostPort;
    Socket hostSocket;
    BufferedReader in;
    PrintWriter out;
    boolean loggedIn;
    LinkedList queue;      // reference to Server queue
    Server serverRef; // reference to main server
    * ClientListener connects to the host server.
    * @param aHostName is the name of the host eg server name or IP address.
    * @param aHostPort is a port number of the host.
    * @param aLoginName is the users login name.
    public ClientListener(InetAddress aHostName, int aHostPort,LinkedList aQueue,Server aServer)      // reference to Server queue)
    hostName = aHostName;
    hostPort = aHostPort;
    queue = aQueue;
    serverRef = aServer;      
    // connect to the server
    try{
    hostSocket = new Socket(hostName, hostPort);
    catch(IOException e){
    //System.out.println("ERROR: Connection Host Failed");
    JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Connection to nPort Failed", JOptionPane.ERROR_MESSAGE);     
    System.exit(0);
    } // end constructor ClientListener
    ** multi client connection server
    ClientWorker(Socket aSocket,LinkedList aQueue, ClientListener aClientListener, boolean diagnostics){
    queue = aQueue;
    addToQueue(this);
    client = aSocket;
    clientRef = aClientListener;
    aDiagnostic = diagnostics;
    } // end constructor ClientWorker
    * run method is the main loop of the server program
    * in change of handle new client connection as well
    * as handle all messages and errors.
    public void run(){
    boolean alive = true;
    String aSubString = "";
    in = null;
    out = null;
    loginName = "";
    loggedIn = false;
    while (alive && client.isConnected()&& clientRef.hostSocket.isConnected()){
    try{
    in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
    if(aDiagnostic){
    out.println("WELCOME to diagnostics");
    broadCastDia("Connect : diagnostics "+client.getInetAddress().toString());
    out.flush();
    else {       
    out.println("WELCOME to Troy's Server");
    broadCastDia("Connect : client "+client.getInetAddress().toString());
         out.flush();
    String line;
    while(((line = in.readLine())!= null)){
    StringTokenizer aStringToken = new StringTokenizer(line, " ");
    if(!aDiagnostic){
    broadCastDia(line);
    clientRef.sendMessage(line); // send mesage out to netExpress
    out.println(line);
    out.flush();
    else{
    if(line.equals("GETIPS"))
    getIPs();
    else{
    clientRef.sendMessage(line); // send mesage out to netExpress
    out.println(line);
    out.flush();
    } // end while
    catch(Exception e){
    // System.out.println("ERROR:Client Connection reset");
                             JOptionPane.showMessageDialog(null, (e.toString()),"ERROR:Client Connection reset", JOptionPane.ERROR_MESSAGE);     
    try{
    if(aDiagnostic){
    broadCastDia("Disconnect : diagnostics "+client.getInetAddress().toString());
    out.flush();
    else {       
    broadCastDia("Disconnect : client "+client.getInetAddress().toString());
         out.flush();
    // close the buffers and connection;
    in.close();
    out.close();
    client.close();
    // System.out.println("out");
    // remove from list
    removeThreadQueue(this);
    alive = false;
    catch(Exception e){
    // System.out.println("ERROR: Client Connection reset failure");
    JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Client Connection reset failure", JOptionPane.ERROR_MESSAGE);     
    }// end while
    } // end method run
    * method run - Generates io stream for communicating with the server and
    * starts the client gui. Run also parses the input commands from the server.
    public void run(){
    boolean alive = true;
    try{
    // begin to life the gui
    // aGuiClient = new ClientGui(hostName.getHostName(), hostPort, loginName, this);
    // aGuiClient.show();
    in = new BufferedReader(new InputStreamReader(hostSocket.getInputStream()));
    out = new PrintWriter(new OutputStreamWriter(hostSocket.getOutputStream()));
    while (alive && hostSocket.isConnected()){
    String line;
    while(((line = in.readLine())!= null)){
    System.out.println(line);
    broadCast(line);
    } // end while
    } // end while
    catch(Exception e){
    //     System.out.println("ERRORa Connection to host reset");
    JOptionPane.showMessageDialog(null, (e.toString()),"ERROR: Connection to nPort reset", JOptionPane.ERROR_MESSAGE);
    try{
    hostSocket.close();
         }catch(Exception a){
         JOptionPane.showMessageDialog(null, (a.toString()),"ERROR: Exception", JOptionPane.ERROR_MESSAGE);
    alive = false;
    System.exit(1);
    } // end method run

Maybe you are looking for

  • Whenever I use the search the results page comes up but if I try and access any of the pages i get the Not responding message

    I can access all my favourite websites ok. It is only when I try and access a page from using Search.

  • Volume can't be adjusted when external screen is attached

    After the OS update of Yosemite my volume on my macbook pro can't be adjusted when the external video by HDMI is attached. It seems that the control of sound is transferred to the external screen, unfortunately my screen volume can only be set by cha

  • File Maker

    Hi all, I have a problem with this script bellow. The error was with the first cell "Nome" but, I can't solve Thanks tell application "FileMaker Pro"     set nomeNovo to cell "Nome" of current record of layout "Catalogo" of database "Catalogo" end te

  • Need help adding services to clusrter

    I'm trying to add two new services to an existing 2 node 11Gr2 RAC cluster. I want to use them for application partitioning. I want some apps to always connect to node 1 and others to always connect to node 2, unless a node is down in which case I wa

  • Create user in solaris

    i have a doubt about how to create a user on solaris. I gave the command :- useradd -g oinstall -d /u01/mediate mediate It creates the user but then i give # su - mediate su: No directory! It is probably not create the home directory for the user, so