Newsgroup: it.comp.java
Titolo: Problema con DaemonThread

Salve a tutti,
ho la necessità di lanciare un Thread come daemon, che a sua volta deve
lanciare una serie di Thread che eseguano delle operazioni...
ho effetutato delle prove ma senza un gran successo...
il processo daemon muore subito e non riesco a far eseguire nulla...
posto un po' di codice... magari qualcuno sa darmi una spiegazione e magari
mi fa capire dove sbaglio...
Vi ringrazio in anticipo,
Amedeo.
P.S.
Se tolgo il setDaemon(true) funziona bene, ma da shell, chiaramente, resto
appeso fino al termine dell'elaborazione... cosa che non voglio ;-)
<<TestThreadDaemon.java>>
import java.io.*;
public class TestThreadDaemon extends Thread {
    public void run() {
        TestFileWriterThread test1 = new TestFileWriterThread("C:/",
"file1.log");
        TestFileWriterThread test2 = new TestFileWriterThread("C:/",
"file2.log");
        TestFileWriterThread test3 = new TestFileWriterThread("C:/",
"file3.log");
        try {
            test1.start();
            test2.start();
            test3.start();
            test1.join();
            test2.join();
            test3.join();
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
    }
    /**
     * Main
     *
     * @param args
     */
    public static void main(String[] args) {
        TestThreadDaemon test = new TestThreadDaemon();
        test.setDaemon(true);
        test.start();
    }
}
<< TestFileWriterThread.java >>
import java.io.*;
public class TestFileWriterThread extends Thread {
    private String mFilePath = null;
    private String mFileName = null;
    /**
     * Costruttore del Thread
     * Inizializza il path e il nome del file su cui scrivere
     *
     * @param filePath
     * @param fileName
     */
    public TestFileWriterThread(String pFilePath, String pFileName) {
        mFilePath = pFilePath;
        mFileName = pFileName;
    }
    /**
     * Esegue la logica di flusso del Thread
     *
     */
    public void run() {
        File localFile = null;
        BufferedWriter bwriter = null;
        try {
            localFile = new File(mFilePath, mFileName);
            bwriter = new BufferedWriter(new FileWriter(localFile));
            long startTime = System.currentTimeMillis();
            bwriter.write("Start");
            bwriter.newLine();
            bwriter.flush();
            while ( (System.currentTimeMillis() - startTime) < 3000  )  {
                bwriter.write(String.valueOf(System.currentTimeMillis()));
                bwriter.newLine();
                bwriter.flush();
            }
            bwriter.write("Stop");
            bwriter.newLine();
            bwriter.flush();
            bwriter.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

 
Il problema e' che thread daemon non significa cio' che pensi tu. Il fatto
che un thread sia daemon o meno non c'entra con il fatto che la shell
venga rilasciata o no. Significa invece che la JVM termina nel momento in
cui non ci sono piu' thread non daemon (e ovviamente i thread daemon
eventualmente presenti vengono terminati anch'essi).
Quindi il tuo thread non deve essere daemon, altrimenti nel momento in cui
il thread che esegue il main finisce (al termine del main), anche il tuo
thread daemon verrebbe terminato.
Devi cambiare il modo in cui esegui la tua applicazione, facendo si' che
venga sganciata dalla shell.
In Linux e' sufficiente aggiungere & alla fine del comando:
java TestThreadDaemon &
In Windows dovrebbe bastare usare il comando javaw invece che java:
javaw TestThreadDaemon
Un'alternativa e' quella di usare il comando start:
start /B java TestThreadDaemon
(ma di quest'ultimo non sono molto sicuro, dato che non uso quasi mai
Windows e in questo momento non ho modo di provare)
-- 
Lucio Benfante - Java User Group Padova
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

 il processo daemon muore subito e non riesco a far eseguire nulla...
http://space.tin.it/computer/csadun/javafaq.html#d1-13
-- 
Fighting for peace is like fucking for virginity
ObjectZone - 
http://space.tin.it/computer/csadun

 ha scritto nel messaggio
news:Xns93A06EAB1B8A3cr...@130.133.1.4...


 ha scritto nel messaggio
news:pan.2003.06.20....@mailandnews.com...
