解耦前: 类SaleTicket与Runnable永远捆绑在了一起,它会变成一个线程类,而不是一个纯粹的类,不能很好体现OOP思想。
package com.han.demo01;
public class TestComparedSaleTicket {
public static void main(String[] args) {
SaleTicket st = new SaleTicket();
new Thread(st, "窗口1").start();
new Thread(st, "窗口2").start();
new Thread(st, "窗口3").start();
}
}
class SaleTicket implements Runnable {
int num = 50;
@Override
public void run() {
for (int i = 0; i < 60; i++) {
buy();
}
}
private synchronized void buy() {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了NO." + (num--) + " 张票,还剩 " + num + " 张票。");
}
}
}
- 为了降低耦合,将线程作为一个单独的资源类,没有任何附属的操作,它会包含 属性、方法。
- 这里Ticket作为资源类,
解耦后: Ticket是一个很纯粹的类。
package com.han.demo01;
public class TestSaleTicket {
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(() -> {
for (int i = 0; i < 60; i++) {
t.sale();
}
}, "窗口1").start();
new Thread(() -> {
for (int i = 0; i < 60; i++) {
t.sale();
}
}, "窗口2").start();
new Thread(() -> {
for (int i = 0; i < 60; i++) {
t.sale();
}
}, "窗口3").start();
}
}
class Ticket {
private int num = 50;
public synchronized void sale() {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了NO." + (num--) + " 张票,还剩 " + num + " 张票。");
}
}
}
|