Vi ringrazio nuovamente per tutti i consigli utilissimi che ogni volta mi illuminano molto.
E' la prima volta che li devo utilizzare, ancora non abbiamo fatto la Fork/Join o gli ExecutorService che sarà in un corso specifico a settembre. Quindi utilizzerò il semplice Thread sempre per completare il server dei Cruciverba. Utilizzando Tomcat, MongoDB e il CruciverbaBuilder (algoritmo sia in backtracking per server piccoli che in programmazione dinamica per server possenti) in multithreading devo generare tutti i possibili cruciverba di uno specificato schema, dominio e difficoltà, memorizzarlo in MongoDB in formato JSON con tutti gli attributi utili e spedirlo al client. Non utilizzo più la serializzazione dipendente dalla versione di Java che già mi aveva dato problemi da Java 8 a 7. E' un progettino universitario siamo in pochi e per novembre dovremmo pubblicare una piccola app free e open source per android, web, ios di un cruciverba un pò alternativo (grafica in LibGDX). Ed è grazie anche a tanta gente come voi, che ci offre dai piccoli ai grandi aiuti gratuitamente e in modo simpatico, che il progettino sta riuscendo.
Non capisco però come far suicidare i miei poveri threads quando terminano la loro esecuzione.
Ecco un piccolo esempio:
===Thread===
public class CrucyThread implements Runnable{
private Thread t;
private String name;
private volatile boolean suspend;
public CrucyThread(Schema schema, String dominio, float difficoltà)
{
......
}
@Override
public void run() {
//Cruciverba Builder ...
}
public void start(){
if ( t == null){
t = new Thread(this,name);
t.start();
}
}
public synchronized void suspend(){
suspend = true;
}
public synchronized void resume(){
suspend = false;
notify();
}
public String getName(){return name;}
}
===Generatore===
public class CrucyGen {
private CrucyDB cdb = CrucyDB.getInstance();
private List<CrucyThread> lct = new ArrayList<>();
public synchronized void generaT(Schema schema, String dominio, float difficoltà)
{
CrucyThread ct = new CrucyThread(schema,dominio ,difficoltà);
lct.add(ct);
ct.start();
}
public void start() ........
......
......