diff --git a/src/main/java/de/mrbesen/telegram/AsyncHandler.java b/src/main/java/de/mrbesen/telegram/AsyncHandler.java index c977135..5fc6c1a 100644 --- a/src/main/java/de/mrbesen/telegram/AsyncHandler.java +++ b/src/main/java/de/mrbesen/telegram/AsyncHandler.java @@ -9,11 +9,20 @@ import org.json.JSONObject; public class AsyncHandler implements Runnable { private List tasks = new LinkedList<>(); - private Thread asynchandlerthread = null; + private Thread[] asynchandlerthread; + private int threadsRunning = 0; private TelegramAPI api; + private static final String THREADPREFIX = "AsyncTgHandler-"; + //just use 1 async thread public AsyncHandler(TelegramAPI api) { + this(api, 1); + } + + //allow as many as threadCount threads to handle Async Tasks + public AsyncHandler(TelegramAPI api, int threadCount) { this.api = api; + asynchandlerthread = new Thread[threadCount]; } public void enque(Task t) { @@ -31,19 +40,34 @@ public class AsyncHandler implements Runnable { } } - //make sure its running - if(asynchandlerthread == null) { - asynchandlerthread = new Thread(this, "AsyncHandler"); - asynchandlerthread.start(); - } else if(!asynchandlerthread.isAlive()) { - asynchandlerthread = null; - } + //muss nicht im syncronized liegen, weil es nur ein read ist + ensureThreads(tasks.size()); } public void enque(String request, String parameters) { enque(new Task(request, parameters)); } + //makes sure, that at least count Threads are running + private void ensureThreads(int count) { + if(count < 1) count = 1; + + synchronized (asynchandlerthread) { + if(threadsRunning >= count) return; //mus im syncronized liegen, damit es nicht zu problemen kommt, wenn diese funktion parallel aufgerufen wird + + //alle threads durchgehen und leere (null) mit neuen Threads füllen + for(int i = 0; i < asynchandlerthread.length && count > 0; i++) { + if(asynchandlerthread[i] == null) { + //spawn a thread + asynchandlerthread[i] = new Thread(this, THREADPREFIX + i); + asynchandlerthread[i].start(); + threadsRunning++; + } + count --; + } + } + } + @Override public void run() { int failed = 0; @@ -68,7 +92,7 @@ public class AsyncHandler implements Runnable { // throw new Exception("Callbacktype missmatch! Got " + obj.getClass().getSimpleName() + " Wanted: " + wanted.getSimpleName() ); } failed = 0; - } catch(UnknownHostException ex) {//host(api.telegram.org) is good -> bad inet + } catch(UnknownHostException ex) { //host(api.telegram.org) is good -> bad inet failed ++; if(failed > 10) try { @@ -87,7 +111,13 @@ public class AsyncHandler implements Runnable { t.printStackTrace(); } } - asynchandlerthread = null; + + int threadid = Integer.parseInt(Thread.currentThread().getName().substring(THREADPREFIX.length())); + + synchronized (asynchandlerthread) { + threadsRunning --; + asynchandlerthread[threadid] = null; //delete thread + } } public static class Task {