106-用Runnable接口将线程的逻辑执行单元从控制中抽取出来
课程目标:
让业务数据和线程逻辑分离。Runnable。@FunctionalInterface
run()
方法为线程的逻辑代码块
叫号机。继承Runnable接口
public class TicketWindowRunnable implements Runnable { private int index = 1; private static final int MAX = 50; @Override public void run() { while (index <= MAX) { System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++)); } } }
银行大厅,柜台,业务处理窗口。
public class BankRunnable { public static void main(String[] args) { TicketWindowRunnable ticketWindow1 = new TicketWindowRunnable(); Thread windowThread1 = new Thread(ticketWindow1, "一号窗口"); Thread windowThread2 = new Thread(ticketWindow1, "二号窗口"); Thread windowThread3 = new Thread(ticketWindow1, "三号窗口"); windowThread1.start(); windowThread2.start(); windowThread3.start(); } }
不管定义多少个线程,业务逻辑的数据实例只有一个,不像Thread类中业务逻辑数据和线程混淆在一起,每一次new Thread()
就会新创建一份业务逻辑数据。
三个线程使用同一份业务数据实例,此时很有可能发生数据安全问题。比如,将MAX=1,可能有以下输出:
一号窗口 的号码是:1
二号窗口 的号码是:2
想一想Runnable接口与多线程中的哪种设计模式比较接近?
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:106-用Runnable接口将线程的逻辑执行单元从控制中抽取出来
文章字数:277
本文作者:神秘的小岛岛
发布时间:2019-11-12, 10:08:08
最后更新:2019-12-24, 11:15:37
原始链接:https://www.tuyrk.cn/wang-thread/106-runnable-bank-queue/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。