我们知道,在实际使用线程的时候,真正的执行逻辑都是写在run方法里面,run方法是线程的执行单元,如果我们直接使用Thread类实现多线程,那么run方法本身就是一个空的实现,如下:

/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
* @see #Thread(ThreadGroup, Runnable, String)
*/
@Override
public void run() {
if (target != null) {
target.run();
}
}

  thread中start实现如下:

public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this); boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}

  

回顾之前的《模板方法模式》不难看出,thread中的run和start是一个比较典型的模板模式,算法结构交由父类实现,具体的逻辑细节交由子类实现。

下面按照thread的run和start方式来实现一个简单的小demo,帮助大家理解。

代码如下:

package com.concurrency.designpattern.behavioral.templatemethod;

/**
* <p>Title: TemeplateMethod</p>
* <p>Description: 参照thread的run和start方法,写的一个小demo</p>
* <p>Company: http://www.yinjiedu.com</p>
* <p>Project: annotation</p>
*
* @author: WEIQI
* @Date: 2019-12-17 0:45
* @Version: 1.0
*/
public class TemeplateMethod { /**
* @description: 输出用户输入的字符串信息,类似于thread中的start()
* @auther: WEIQI
* @date: 2019-12-17 0:56
* @param inputString 用户输入字符串
*/
public final void outputString(String inputString) {
System.out.println("*******************");
userInput(inputString);
System.out.println("*******************");
System.out.println();
} /**
* @description: 暴露给继承类的方法,类似于thread中的run()
* @auther: WEIQI
* @date: 2019-12-17 0:57
* @param inputString 用户输入字符串
*/
protected void userInput(String inputString) {
} /**
* @description: 编写简单的测试功能模块
* @auther: WEIQI
* @date: 2019-12-17 0:58
*/
public static void main(String[] args) {
// 对象引用1,类似于创建一个线程
TemeplateMethod temeplateMethod1 = new TemeplateMethod(){
@Override
protected void userInput(String inputString) {
System.out.println(inputString);
}
};
// 第一个引用调用算法封装方法,类似于线程调用start()方法
temeplateMethod1.outputString("user1 input data"); // 对象引用2,类似于创建另外一个线程
TemeplateMethod temeplateMethod2 = new TemeplateMethod(){
@Override
protected void userInput(String inputString) {
System.out.println(inputString);
}
};
// 第二个引用调用算法封装方法,类似于线程调用start()方法
temeplateMethod2.outputString("user2 input data");
}
}

  运行结果:

在start方法申明时,加了synchronized 关键字保证了原子性,对于启动线程之前状态检查、加入线程组、调用native方法等都作为算法模板,由父类Thread完成。

想要了解实时博文,可以关注公众号《编程之艺术》

Thread之模板模式的更多相关文章

  1. ActiveMQ学习心得:连接池的简单实现和模板模式的应用

    一.安装activemq 下载地址:https://archive.apache.org/dist/activemq/5.13.0/apache-activemq-5.13.0-bin.zip 下载完 ...

  2. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  3. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  4. Java设计模式(七) 模板模式

    [模板模式]在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 1,定义模板类 package com.pattern ...

  5. 模板模式与策略模式/template模式与strategy模式/行为型模式

    模板模式 模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去 ...

  6. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 模板模式(C++) 【转】

    模板模式(template)在面向对象系统的设计和开发过程中,一定会有这样的情况:对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的,这就是模板(template)模式的用武之地,我 ...

  8. Head First 设计模式系列之一----模板模式(java版)

    开篇序言:四人帮的设计模式对于我这个菜鸟看着打瞌睡,后面果断买了一本head first的,感觉还可以像看报纸似的,花了一个寒假的晚上看了大半,确实内容也挺吸引人的,讲的很风趣.否则我也不可能,大过年 ...

  9. 模板模式(Template)

    行为型:Template(模板模式) 作为一个曾经爱好写文章,但是不太懂得写文章的人,我必须承认,开头是个比较难的起步. 模板模式常规定义:模板模式定义了一个算法步骤,把实现延迟到子类. 事实上模板模 ...

随机推荐

  1. ETCD:多机上的集群

    原文地址:cluster on multiple machines 总览 启动一个集群静态的要求是每一个集群中的成员需要知道其他成员的位置.在许多情况下,集群成员的IP可能无法提前知道.在这种情况下, ...

  2. maven修改运行环境配置

    maven中自带的tomcat是6版本,比如我们想用tomcat7,jdk1.8,我们就要通过配置来改变. 改变方式如下 <build> <plugins> <plugi ...

  3. python进程基础点整理

    操作系统 串行: 一个程序完完整整的执行完再执行下一个 并发: 看起来像是同时运行,其实就是程序间的切换频率比较快,看不出来 并行:真正的同时运行 多道技术 空间复用:共用一个内存条,多个进程相互隔离 ...

  4. C# webclient progresschanged downlodfileCompleted

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. .net core 2.1 基于Jwt的登录认证

    1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...

  6. 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠

    最近遇到一个比较郁闷的问题,记录一下 写了一个接口,想返回json 数据,但是返回值中总是带有反斜杠... ,下面来看原因 首先,配置 webapi的路由 App_Start 文件夹下 ,WebApi ...

  7. MySql-8.0.16-winx64 安装

    参考文章: https://www.cnblogs.com/lxlin/p/9635350.html https://www.cnblogs.com/xc1234/p/9050149.html MyS ...

  8. python distutils 基本打包与发布

    distutils 实现对package 包的发布 import math def showMsg(a): return a * a * a a = 10 print('%d 的三次方是 %d' % ...

  9. windows下的go get 显示进度

    我的Go版本是:go1.12.7 1.在你的Go安装目录下找到 D:\Go\src\github.com\tools\godep\vendor\golang.org\x\tools\go\vcs\vs ...

  10. 首个企业架构TOGAF角色扮演案例培训的诞生

    BangEA企业架构系列在不同机构做了不少TOGAF认证课,自己都觉得有点枯燥了,我在想我们IT帮2020年第一期的认证课是不是该换种授课方式呢?想到就做......TOGAF认证培训,最早主要就是讲 ...