2016-07-27 27 views
0

Ich versuche, ein Multi-Thread-Programm mit zwei Threads zu schreiben; der erste wird eine Direktzugriffsdatei aktualisieren, nachdem ein "neuer" Befehl angefordert wurde, und der zweite akzeptiert die Befehle "neu" oder "Ende" und sendet sie an den ersten Thread. Ich wollte eine Warteschlange benutzen, die von einem Semaphor gesteuert wird, was ich unten geschrieben habe. Ich weiß nur nicht, wie ich den anderen Thread assoziiere. Der eine Thread sollte Zeichenfolgen aus dem Benutzerbefehl erzeugen und in die Warteschlange einfügen, und der andere Thread ruft die Zeichenfolgen aus der Warteschlange ab, um sie in die Datei mit direktem Zugriff zu schreiben. Kann jemand helfen, den Thread zu starten?Ich habe Probleme mit dem Erstellen von zweiten Thread für ein Multi-Thread-Programm

package multi_threaded_producer_consumer; 
import java.util.concurrent.Semaphore; 

public class MTQueue { 

    private Semaphore sem = new Semaphore(1); 
    private java.util.Queue<String> statQ; 

    public static void main(String[] args) { 

    } 

    public MTQueue(){ 
     statQ = new java.util.LinkedList<String>(); 
    } 

    public void MTPut(String qe) { 
     try { 
      sem.acquire(); 
      statQ.offer(qe); 
     } catch(InterruptedException ex) { 

     } finally { 
      sem.release(); 
     } 
    } 

    public String MTGet() { 
     String retVal = new String(); 
     try { 
      sem.acquire(); 
      retVal = statQ.poll(); 
     } catch(InterruptedException ex) { 

     } finally { 
      sem.release(); 
     } 
     return retVal; 
    } 

} 
+1

Stehen Sie buchstäblich nur zu fragen, wie ein Thread in Java zu schreiben? Es ist ein neuer Thread (myRunnable) .start(). Wobei myRunnable eine Klasse mit einer run-Funktion ist, die das tut, was der Thread tun soll. Wenn Sie etwas anderes fragen, versuchen Sie, klarer zu sein. –

+0

@GabeSechan Setze ich es in eine separate Klasse oder füge es in das ein, was ich bereits geschrieben habe? Dies sind wahrscheinlich dumme Fragen, aber ich verstehe wirklich nicht die Gründe für die Verwendung von Multi-Threading überhaupt – Chief

+0

Schlucken 'InterruptedException' (oder irgendeine andere Ausnahme) ist eine _sehr schlechte Angewohnheit. Wenn Sie nicht erwarten, dass Ihr Programm unterbrochen wird, und es Ihnen egal ist, was passiert, wenn es unterbrochen wird, dann sollten Sie am wenigsten 'RuntimeException (ex) werfen;' –

Antwort

0

Kann jemand Hilfe Läuten, wie der Faden, um loszulegen?

Sicher. Bei einem grundlegenden Thread müssen Sie eine Klasse Runnable erstellen, damit der Thread ausgeführt wird. Hier ist ein good tutorial on the subject.

Hier ist ein Beispiel für den Code für Ihren Hersteller:

// queue must be final for the Runnable classes to use it 
final MTQUeue queue = new MTQueue(); 
... 
// create a new producer thread and start it 
new Thread(new Runnable() { 
    public void run() { 
     queue.MTPut("new"); 
     queue.MTPut("end"); 
    } 
}).start(); 
... 
// create a new consumer thread and start it 
new Thread(new Runnable() { 
    public void run() { 
     System.out.println("Got command: " + queue.MTGet()); 
     System.out.println("Got command: " + queue.MTGet()); 
    } 
}).start(); 

paar anderen Kommentare über Ihren Code in keiner Reihenfolge:

  • Ich nehme an, das ein wissenschaftliches Projekt. Ansonsten sehen Sie sich LinkedBlockingQueue an, die das für Sie erledigt.
  • MTPut() und MTGet() Methoden sollten wahrscheinlich nur put() und get() sein. Das MT ist im Klassennamen.
  • statQ.offer(...) sollte wahrscheinlich statQ.add(...) sein. Die Methode offer() gilt nur für Warteschlangen, die begrenzt sind. Die LinkedQueue gehört nicht dazu.
  • String retVal = new String(); Die new String() wird nicht benötigt und kann entfernt werden. Wirklich können Sie eine return statQ.poll(); tun und keine retVal haben.
  • Catching InterruptedException ex und es zu ignorieren ist wirklich schlechte Praxis. Wenn Sie es zu fangen, sollten Sie immer mindestens den aktuellen Thread unterbrechen:

    } catch(InterruptedException ex) { 
        // always a good pattern to re-interrupt the current thread 
        Thread.currentThread().interrupt(); 
        // since the thread was interrupted we should return or something 
        return;