【图解Java多线程设计模式】Thread-Per-Message模式

为每个命令或请求新分配一个线程,由这个线程来执行处理。在Thread-Per-Message模式中,消息的“委托端”和“执行端”是不同的线程。

示例

Main类委托Host类来显示字符。Host类会创建并启动一个线程,来处理该委托。启动的线程使用Helper类来执行实际的显示。

类图

F5NEe1.md.png

时序图

F5NVdx.md.png

Timethreads图

F5NGwt.md.png

Main.java

1
2
3
4
5
6
7
8
9
10
11
public class Main {

public static void main(String[] args) {
System.out.println("main BEGIN");
Host host = new Host();
host.request(10, 'A');
host.request(20, 'B');
host.request(30, 'C');
System.out.println("main END");
}
}

Host.java

匿名内部类用于执行如下操作:

  • 声明Thread的子类,并重写run方法
  • 创建该类的实例
  • 调用该实例的start方法启动线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Host {
private final Helper helper = new Helper();

public void request(final int count, final char c) {
System.out.println(" request(" + count + ", " + c + ") BEGIN");

new Thread() {
public void run() {
helper.handle(count, c);
}
}.start();

System.out.println(" request(" + count + ", " + c + ") END");
}
}

Helper.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Helper {
public void handle(int count, char c) {
System.out.println(" handle(" + count + ", " + c + ") BEGIN");

for (int i = 0; i < count; i++) {
slowly();
System.out.print(c);
}

System.out.println("");
System.out.println(" handle(" + count + ", " + c + ") END");
}

private void slowly() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
main BEGIN
request(10, A) BEGIN
request(10, A) END
request(20, B) BEGIN
handle(10, A) BEGIN
request(20, B) END
request(30, C) BEGIN
handle(20, B) BEGIN
request(30, C) END
main END
handle(30, C) BEGIN
CABACBACBABCBCAACBACBACBABCCBA
handle(10, A) END
CBCBCBBCBCBCCBCBBCCB
handle(20, B) END
CCCCCCCCCC
handle(30, C) END

登场角色

Client(委托人)

Client角色会向Host角色发出请求(request),但是并不知道Host角色是如何实现该请求的。在示例程序中,由Main类扮演此角色。

Host

Host角色收到Client角色的请求(request)之后,会创建并启动一个线程。新创建的线程将使用Helper角色来“处理”(handle)请求。在示例程序中,由Host类扮演此角色。

Helper(助手)

Helper角色为Host角色提供请求处理的功能。Host角色创建的新线程会利用Helper角色。在示例程序中,由Helper类扮演此角色。

类图

F5dkLj.png