Как остановить поток после завершения запуска?
1750 просмотра
1 ответ
У меня есть список задач и ограниченное количество потоков. Цель состоит в том, чтобы определить время, необходимое для выполнения задач с использованием этого количества потоков.
Я знаю, что что-то не так с тем, как я использую потоки и Runnable
объекты. Я новичок в них и не могу понять, как это исправить.
Это ошибки с java.lang.OutOfMemoryError: Java heap space error
на линии worker.start()
через несколько секунд.
Вот мой код:
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");
}
}
Автор: Mary Mistretta
Источник
Размещён: 12.11.2019 09:47
Ответы (1)
1 плюс
Вам не нужно .. После того, как поток завершил run()
метод Runnable
, он должен быть завершен. Ошибка OOM, с которой вы сталкиваетесь, связана с логикой внутри run()
метода Runnable
.
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- multithreading Что такое состояние гонки?
- multithreading Что такое тупик?
- multithreading Что такое мьютекс?
- multithreading Как начать потоки в plain C?
- multithreading Потокобезопасный foreach перечисление списков
- runnable Разница между интерфейсами Runnable и Callable в Java
- runnable «реализует Runnable» vs «extends Thread» в Java
- runnable Почему run () вызывается не сразу, когда start () вызывается для объекта потока в Java
- runnable Как удалить runnable из объекта-обработчика, добавленного postDelayed?
- runnable Именование потоков и потоков-потоков ExecutorService
- thread-synchronization Насколько быстро атомная / блокируемая переменная по сравнению с блокировкой, с конфликтом или без него?
- thread-synchronization Как остановить поток после завершения запуска?
- thread-synchronization Как поток может получить блокировку для двух объектов одновременно, как в этом случае?
- thread-synchronization Распечатать номера 1-20 с двумя потоками в Java
- thread-synchronization ReleaseMutex: метод синхронизации объектов вызывается из несинхронизированного блока кода