Domanda

Prima un po 'di storia. Ho ottenuto un avvertimento in NetBeans mi ha detto di non iniziare un nuovo thread in un costruttore. Ho letto che la ragione di ciò è perché il nuovo thread potrebbe iniziare e cercare di fare riferimento all'oggetto ha iniziato la discussione prima che il costruttore è in realtà fatto rendendo l'oggetto.

1). Per motivi di sperimentazione, invece di utilizzare new Thread e thread.start() ho provato ExecutorService e ho avuto nessun avvertimento. Fa questa media è ok per creare e avviare un nuovo thread in un costruttore se uso ExecutorService?

2.) Inoltre, se ho un ExecutorService sotto forma di un pool di thread cache sarà la creazione di un nuovo filo con il metodo standard di new Thread e thread.start() tirare un filo dal pool cache (o causare a creare uno se uno non è disponibile) o sono quei fili completamente indipendente dal pool di thread cache?

È stato utile?

Soluzione

  

1) [...] Questo significa che è ok per creare e avviare un nuovo thread in un costruttore se uso ExecutorService?

Regola generale: non perdano il riferimento all'oggetto in costruzione (this) finché non è completamente costruito. Cioè, non dare via ad un altro this therad nel costruttore, non aggiungere te stesso come un ascoltatore all'interno del costruttore, ecc, ecc ... Cioè, non usare mai this come parametro a una funzione all'interno del costruttore.

  

2) [...] sarà la creazione di un nuovo thread con il metodo standard di new Thread e thread.start() tirare un thread dal pool di cache [...]

No, non c'è alcun modo new avrebbe potuto essere sovraccaricato di non creare un oggetto fresca. In questi casi sarà necessario passare attraverso un metodo factory.

Altri suggerimenti

1) No, è probabilmente solo una limitazione dell'analisi statica NetBeans. Naturalmente è sicuro di fare in entrambi i casi se non si perdita di un riferimento all'oggetto attualmente in costruzione.

Fuoriuscita un riferimento a un oggetto in costruzione non è pericolosa solo in situazioni multi-threaded, neanche. Anche se si chiama un metodo esterno dal costruttore, passando se stessi come un parametro, il metodo potrebbe usarti impropriamente.

2) No, new crea sempre un nuovo oggetto, senza eccezioni. Si sta andando in giro per il pool di thread.

Il dovere costruttore è solo per costruire un oggetto, se si dispone di un oggetto che si estendono Thread, non si dovrebbe chiamare per iniziare () dall'interno del costruttore, altro oggetto diverso dovrebbe chiamare start ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top