Announcement

Collapse
No announcement yet.

Threading basics

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Threading basics

    Hallo Forum,

    hab seit einiger Zeit mit einer Webanwendung zu kämpfen, bei der ich einen Thread starte und über einen Filter mir die Requests loggen möchte. Bei jedem Rq sende ich ein Rq Object in eine ConcurrentLinkedQueue welche dann von dem Thread abgearbeitet wird. Dieser Thread ist aber im wait status und soll nach dem insert in die ConcurrentLinkedQueue mit einem notify wieder zum Leben erwachen.

    Beim notify bekomme ich aber:
    java.lang.IllegalMonitorStateException: current thread not owner

    Wenn anstatt dem wait ein sleep nehme und mit interrupt arbeite geht alles wie geschmiert, aber das bedeutet auch, daß ich in die InterruptException beim sleep laufe und ich eigentlich keine Exception für den normalen Programmableuf verweden möchte, da unschön und auch teuer.

    Der Code sieht inetwa so aus.

    Ich habe eine Klasse die den Thread und die ConcurrentLinkedQueue hält.

    public static Thread rqLogQueue;
    public static ConcurrentLinkedQueue<Request> requests = new ConcurrentLinkedQueue<Request>();

    Der Thread wird über einen ContextListener gestartet und gestop:

    public class RqLogListener implements ServletContextListener
    {

    public void contextInitialized(ServletContextEvent evt)
    {
    RqLogQueue.stop = false;
    main.rqLogQueue = RqLogQueue.startThread();
    }


    public void contextDestroyed(ServletContextEvent evt)
    {
    RqLogQueue.stop = true;
    main.rqLogQueue.notify();
    }
    }

    und die Klasse die die das wirkliche Starten des Threads macht sieht so aus:

    public class RqLogQueue implements Runnable
    {
    public static boolean stop = true;

    public static Thread startThread()
    {
    RqLogQueue rlq = new RqLogQueue();
    Thread thread = new Thread(rlq, "Skipack store rq thread");
    thread.start();
    return thread;
    }

    public void run()
    {
    while (!stop)
    {
    while(!main.requests.isEmpty())
    {
    new RecordRequest().logRequest(main.requests.poll());
    }
    try
    {
    Thread.wait();
    }
    catch (InterruptedException ex){}
    }
    /* im Falle eines Abbruchs noch alle Rq in der Queue abarbeiten */
    while(!main.requests.isEmpty())
    {
    new RecordRequest().logRequest(main.requests.poll());
    }
    }

    }

    Der notify vom RequestFilter sieht so aus:
    main.requests.offer(new Request((HttpServletRequest)request));
    main.rqLogQueue.notify();

    Ich hoffe man kann mit den Codeteilen und mit meinen Erklärungen mein Problem verstehen. Zu der Meldung: mir ist zwar klar, daß der Thread nicht der owner ist, aber was hab ich hier falsch gemacht?

    Bin für jeden Tip dankbar.

    lg Dietmar

  • #2
    Hallo!

    notify() und wait() müssen immer in einen synchronized-Block: http://www.galileocomputing.de/openb...ee8414a97ee07f

    Beste Grüße

    Christian

    Comment


    • #3
      Hallo Christian,

      danke für den Link, das ist's gewesen :-)

      lg Dietmar

      Comment

      Working...
      X