Könnte für den Banana-Chat sinnvoll sein, wenn man weiß, dass sich ca. alle 60 Sekunden ein neuer User einloggt. Den Timeout höher zu stellen halte ich für weniger sinnvoll, wenn der Chat eher selten besucht wird macht es nicht viel Sinn den Thread so lange anzuhalten nur um keinen neuen initialisieren zu müssen.
Generell eignet sich mein Thread Pool nicht unbedingt für Networking, hier arbeitet man dann doch eher mit Nio (siehe bspw. Apache mina). Hätte damals schon mina verwenden sollen, habe mich hier aber erstmals richtig mit Networking beschäftigt gehabt und bewusst darauf verzichtet, um mich in Sockets einzuarbeiten.
PoolThread.java
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package server.tools.thread;
/**
*
* @author Flav
*/
public class PoolThread extends Thread {
private Runnable runnable;
public PoolThread(Runnable runnable) {
this.runnable = runnable;
}
public void start() {
if (getState() == Thread.State.NEW) {
super.start();
} else {
synchronized (this) {
notify();
}
}
}
public void run() {
runnable.run();
runnable = null;
while (runnable == null) {
synchronized (this) {
try {
wait(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (runnable == null) { // still not in use after 60 seconds
return;
}
run();
}
public boolean isInUse() {
return runnable != null;
}
public void setRunnable(Runnable runnable) {
this.runnable = runnable;
}
}
|
ThreadPool.java
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package server.tools.thread;
import java.util.ArrayList;
/**
*
* @author Flav
*/
public class ThreadPool {
private final static ArrayList<PoolThread> pool;
static {
pool = new ArrayList<PoolThread>();
}
public static PoolThread getThread(Runnable runnable) {
synchronized (pool) {
for (PoolThread thread : pool) {
if (!thread.isInUse()) {
thread.setRunnable(runnable);
return thread;
}
}
PoolThread thread = new PoolThread(runnable);
pool.add(thread);
return thread;
}
}
}
|