neu zu Multithreading hier bitte mit mir. Ich versuche, 2 Threads auszuführen, die Elemente aus einer Liste von Aufgaben (insgesamt 10 Tasks) entfernen, bis die Taskliste leer ist.Java Multithreading - Entfernen Sie Elemente aus der Liste
Was ich bisher ist:
Main-Methode:
public static void main(String[] args) {
List<Task> taskList = new ArrayList<Task>();
List<Thread> threadList = new ArrayList<Thread>();
for (int i = 1; i <= 10; i++) {
taskList.add(new Task("some details");
}
TaskManager manager = new TaskManager();
gestor.setTaskList(taskList);
Thread t1 = new Thread(taskManager);
Thread t2 = new Thread(taskManager);
threadList.add(t1);
threadList.add(t2);
if(threadList.size() > 0){
for (Thread thread : threadList){
thread.start();
}
}
for (Thread thread : threadList){
try {
thread.join();
} catch (InterruptedException e) {
System.out.println("thread " + Thread.currentThread().getName() + " was interrupted");
}
}
System.out.println("END OF MAIN");
}
Task-Manager-Klasse:
public class TaskManager implements Runnable {
private List<Task> availableTasks;
private Random random = new Random();
public void setAvailableTasks(List<Task> availableTasks) {
this.availableTasks = availableTasks;
}
@Override
public void run() {
while (!availableTasks.isEmpty()) {
takeTask();
}
}
public void takeTask() {
try {
Thread.sleep(1000);
int index = random.nextInt(availableTasks.size());
Task task = availableTasks.get(index);
printDetails(task);
availableTasks.remove(task);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void printDetails(Task task) {
//here it should print the details to the console
}
}
Die Sache ist, entweder es läuft 2 mal oder es ist immer das gleiche Thread läuft 10 mal. Ich weiß, es ist wahrscheinlich eine dumme Frage, aber ich hoffe, dass jemand es klären kann! Vielen Dank im Voraus
Edit: Ich konnte es
Nehmen Aufgabe Methode bearbeitet, wie so mit @ Lidae Vorschlag funktioniert:
public void takeTask() {
try {
Thread.sleep(1000);
synchronized (this) {
if (!availableTasks.isEmpty()) {
int index = random.nextInt(availableTasks.size());
Task task = availableTasks.get(index);
printDetails(task);
availableTasks.remove(task);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
wo erstellen und starten Sie mehrere Threads? – Reek
bearbeitet mit Hauptmethode –