创建一个Thread需要继承Thread重写run方法或者实现Runnable接口中的run方法,其实两者都是一样因为Thread也继承了Runnable接口。

实现了run方法,但是启动确实用start方法,那么这是为什么?

Thread使用模板设计模式,线程控制的逻辑交给Thread自己,而实现的业务逻辑则交给run方法。

先看一下start方法的一段源码:

 1  if (threadStatus != 0)
2 throw new IllegalThreadStateException();
3
4 group.add(this);
5
6 boolean started = false;
7 try {
8 start0();
9 started = true;
10 } finally {
11 try {
12 if (!started) {
13 group.threadStartFailed(this);
14 }
15 } catch (Throwable ignore) {
16 /* do nothing. If start0 threw a Throwable then
17 it will be passed up the call stack */
18 }
19 }

  其中run方法是由第8行start0()来启动的。

总的来说就是:run方法来实现自己的业务逻辑,而线程的其他控制逻辑交给Thread,也就是start方法中除了启动run的start0其他逻辑代码则是线程控制的逻辑代码。

  来看一个模板方法的例子:

public class TemplateMethodDesign {
public final void printMsg(String msg){
System.out.println("System control logic");
customizedMsg(msg);
System.out.println("System the other control logic");
} protected void customizedMsg(String msg){ } public static void main(String[] args){
TemplateMethodDesign design = new TemplateMethodDesign(){
@Override
public void customizedMsg(String msg) {
System.out.println(msg);
}
};
design.printMsg("here is your logic");
}
}
customizedMsg重写自己的逻辑,printMsg方法定义控制的逻辑代码而且是final修饰的,不允许重写。好处就是,结构代码交给父类,子类只需要实现自己的业务逻辑即可。

Thread中run和start方法的模板设计模式的更多相关文章

  1. Java线程中run和start方法的区别

    http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法 ...

  2. java Thread 类 run 和 start 方法区别

    public class ThreadModle { public static void main(String[] args) throws InterruptedException { Thre ...

  3. 二、多线程之Thread中run 和start 区别

    Thread使用run 和start 区别 结论:run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程. System.out.println("开始测试多线程&quo ...

  4. java面试题之Thread的run()和start()方法有什么区别

    run()方法: 是在主线程中执行方法,和调用普通方法一样:(按顺序执行,同步执行) start()方法: 是创建了新的线程,在新的线程中执行:(异步执行) public class App { pu ...

  5. (一)Thread的run() 和 start() 方法

    Java多线程在实际开发中会遇到很多问题,对于这种争抢CPU时间片段的选手,我们或许有很多困惑,捉摸不透.即便如此,它也是可以被我们控制的. 最近在看Java多线程的书籍,里面有好多我曾经不怎么注意的 ...

  6. Java中run(), start(), join(), wait(), yield(), sleep()的使用

    run(), start(), join(), yield(), sleep() 这些是多线程中常用到的方法. run(): 每个Thread中需要实现的方法, 如果直接调用的话, 会是和单线程一样的 ...

  7. Java多线程中run(), start(), join(), wait(), yield(), sleep()的使用

    Run 每个Thread中需要实现的方法, 如果直接调用的话, 会是和单线程一样的效果, 要另起线程需要使用start(). start 新起线程调用run(). 主线程不等待直接往下执行 Yield ...

  8. Thread中的start()方法和自己定义的run()方法有什么区别

    在讲这个问题之前引入一下多线程的小知识吧 /*/windows系统中的应用程序来做说明 ,例如:扫雷程序,游戏进行的同时,可以同时记录分数,计算时间等. 其实一个应用程序就是一个可执行文件,中包含了一 ...

  9. Android Framework中的线程Thread及它的threadLoop方法

    当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了许很多多的Thread.它们普遍的特点就是有一个threadLoop方法.依照字面的意思应该是这个线程能够循环 ...

随机推荐

  1. 第5章函数进阶 第5.1节 Python函数的位置参数、关键字参数精讲

    前面第二章简单介绍了函数定义的语法,经过后面一系列的学习,函数有必要再次介绍一下相关内容. 一.    关于函数的语法 1.    语法 def 函数名([参数]): 函数文档字符串 函数体      ...

  2. 利用Python特殊变量__dict__快速实现__repr__的一种方法

    在<第8.15节 Python重写自定义类的__repr__方法>.<Python中repr(变量)和str(变量)的返回值有什么区别和联系>.<第8.13节 Pytho ...

  3. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget中使用findItems搜索项

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTreeWidget类实例的树型部件中,可以根据文本.搜索列以及匹配模式来搜索满足条件的项,调用 ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中部件mimimumSize和maximumSize的含义

    1.mimimumSize mimimumSize表示部件能被缩小到的最小尺寸,单位为像素,缩小到该尺寸后不能再进一步缩小了.如果部件在布局管理器中,且布局管理器也设置了最小尺寸,则部件本身的最小尺寸 ...

  5. 项目测试环境自动化部署[jenkins前后端配置、Nginx配置]

    持续部署:关注点在于项目功能部署到服务器后可以正常运行,为下一步测试环节或最终用户正式使用做准备.(问题点:一个环节有问题,其他环节跟着有问题) 持续集成:关注点是在于尽早发现项目整体运行问题,尽早解 ...

  6. 添加和读取Resources嵌入资源文件(例如.dll和.ssk文件)

    前言:有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合 ...

  7. 【Dotnet9-01】从0开始搭建开源项目-lqclass.com

    行文目录 一. 前言 1.1 我的现有网站 1.2 想法:新开发一个网站 1.3 目前开发计划 二. 行动了 2.1 Github创建项目 2.2 使用 WTM 搭建后台框架 2.3 项目演示 2.4 ...

  8. Codeforces Edu Round 64 A-D

    A. Inscribed Figures 分类讨论打表即可. PS:这道题翻译有歧义. 这样稍微翻转一下,就可以是\(7\)个交点呀...(大概是我没看英文题干导致的惨案) #include < ...

  9. 题解-[WC2011]最大XOR和路径

    [WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...

  10. k8s遇见的问题

    open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory 解决方案   ...