Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Banana-Coding.com - Java Knuddels Emulator. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

28.08.2012, 01:30

Simples Thread Pooling

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;
		}
	}
}
Tschüß.

Ähnliche Themen