¿Cómo detener un hilo después de que haya completado el runnable?

Tengo una lista de tareas y un número limitado de subprocesos. El objetivo es calcular el tiempo que tardan las tareas en terminar con este número de subprocesos.

Sé que algo está mal con la forma en que estoy usando hilos yRunnable objeto. Soy nuevo para ellos y parece que no puedo entender cómo solucionarlo.

Se errores con unjava.lang.OutOfMemoryError: Java heap space error en la líneaworker.start() después de unos segundos.

Aquí está mi código:

public class Tasks {

static Timer timer; //times how long it takes to complete all tasks

public static void main(String[] args) {
    Job t1 = new Sleep(5);
    Job t2 = new Sum(1000);
    Job t3 = new Sleep(3);
    Job t4 = new Sleep(10);
    Job t5 =  new Sum(10);
    Graph g = new Graph(5);
    g.getNumEdges();
    g.addEdge(t1, t2);
    g.addEdge(t2, t3);
    g.addEdge(t2, t4);
    g.addEdge(t3, t5);
    g.addEdge(t4, t5);
    //System.out.println(t5.getPredecessor());
    System.out.println(parseGraph(g, 2));

}

public static String parseGraph(Graph graph, int K)
{
    long startTime = System.nanoTime();//start timer
    int numThreads = K;
    ArrayList<Job> x = graph.getNodes();
    //check for cycles
    CycleFinder dc = new CycleFinder(graph);
    if(dc.hasCycle()==true)
    {
        System.out.println(dc.cycle());
        return ("The graph has cycles and could not be parsed through.");
    }
    List<Thread> threads = new ArrayList<Thread>();
    ArrayList<Job> ready = new ArrayList<Job>();
    while (x.isEmpty()!= true)
    {
        for(int i=0; i<x.size(); i++)
        {
            Job y= x.get(i);
            System.out.println(y);
            if(y.getComplete()== true)
            {
                ready.remove(y);
                graph.removeNode(y);
                x.remove(y);
            }
            if(y.getPredecessor().isEmpty() || y.getPredecessor() ==null)
                ready.add(y);
        }
        for (int i = 0; i < numThreads && i < ready.size(); i++) {
            System.out.println("test");
            Runnable task = new MyRunnable(ready.get(i));
            Thread worker = new Thread(task);
            worker.setName(String.valueOf(i));
            worker.start();
            threads.add(worker);
          }
       //int running = 0;
       //do {
       //running = 0;
          //for (Thread thread : threads) {
            //if (thread.isAlive()) {
             // running++;
           // }
         // }System.out.println("We have " + running + " running threads. ");
       // } while (running > 0);
}
    long endTime = System.nanoTime();
    long duration = endTime - startTime;
    return ("The Tasks took " + (duration/1000) + " seconds");
}


}

Respuestas a la pregunta(1)

Su respuesta a la pregunta