`
liuxinglanyue
  • 浏览: 562775 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java牛角尖【008】: 可以通过调用一个线程的run方法启动一个线程吗?

阅读更多
 我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法来启动一个线程吗? 
  先看下面一段代码: 
Java代码 
1.  public class Test {    
2.      public static void main(String[] args) {    
3.          // TODO Auto-generated method stub    
4.          TestThread tt = new TestThread();    
5.          tt.run();    
6.      }    
7.  }    
8.      
9.  class TestThread extends Thread {    
10.     static int i = 0;    
11.     final static int MAX_I = 10;    
12.     
13.     @Override    
14.     public void run() {    
15.         // TODO Auto-generated method stub    
16.         while (i < MAX_I) {    
17.             System.out.println(i++);    
18.         }    
19.     }    
20. }    

  运行结果如下: 
Java代码 
1.  0    
2.  1    
3.  2    
4.  3    
5.  4    
6.  5    
7.  6    
8.  7    
9.  8    
10. 9   

  或许有人会得出结论,这样启动一个线程是可以的,我们再对程式稍做修改,大家就会发现一个问题: 
Java代码 
1.  public class Test {    
2.      public static void main(String[] args) {    
3.          // TODO Auto-generated method stub    
4.          TestThread tt = new TestThread();    
5.          tt.run();    
6.          System.out.println("Printed by main thread");    
7.      }    
8.  }    
9.      
10. class TestThread extends Thread {    
11.     static int i = 0;    
12.     final static int MAX_I = 10;    
13.     
14.     @Override    
15.     public void run() {    
16.         // TODO Auto-generated method stub    
17.         while (i < MAX_I) {    
18.             System.out.println(i++);    
19.         }    
20.     }    
21.     
22. }    

  这里只在主线程中加入了一行代码,打印一行"Printed by main thread",运行代码,结果如下: 
Java代码 
1.  0    
2.  1    
3.  2    
4.  3    
5.  4    
6.  5    
7.  6    
8.  7    
9.  8    
10. 9    
11. Printed by main thread    

  熟练多线程开发的要发现问题了,为什么"Printed by main thread"会打印在最后一行呢?TestThread类中一直持有时间段吗? 
  我们对上面的代码进行分析,其实非常简单,这只是一个普通的类中方法的调用,其实是一个单线程的执行,我们来修改代码进一步验证这一点: 
Java代码 
1.  public class Test {    
2.      public static void main(String[] args) {    
3.          // TODO Auto-generated method stub    
4.          TestThread tt = new TestThread();    
5.          tt.run();    
6.          System.out.println(Thread.currentThread().getName());    
7.          System.out.println("Printed by main thread");    
8.      }    
9.  }    
10.     
11. class TestThread extends Thread {    
12.     static int i = 0;    
13.     final static int MAX_I = 10;    
14.     
15.     @Override    
16.     public void run() {    
17.         // TODO Auto-generated method stub    
18.         System.out.println(Thread.currentThread().getName());    
19.         while (i < MAX_I) {    
20.             System.out.println(i++);    
21.         }    
22.     }    
23. }    

  这段代码分别在主线程和我们的TestThread的方法中打印当前线程名字,运行结果如下: 
Java代码 
1.  main    
2.  0    
3.  1    
4.  2    
5.  3    
6.  4    
7.  5    
8.  6    
9.  7    
10. 8    
11. 9    
12. main    
13. Printed by main thread    

  在TestThread类和主线程中运行的是同一个线程,说明在直接调用run时是不能使用多线程的,那么把上面的run方法调用改为start方法的调动再看一下: 
Java代码 
1.  public class Test {    
2.      public static void main(String[] args) {    
3.          // TODO Auto-generated method stub    
4.          TestThread tt = new TestThread();    
5.          tt.start();    
6.          System.out.println(Thread.currentThread().getName());    
7.          System.out.println("Printed by main thread");    
8.      }    
9.  }    
10.     
11. class TestThread extends Thread {    
12.     static int i = 0;    
13.     final static int MAX_I = 10;    
14.     
15.     @Override    
16.     public void run() {    
17.         // TODO Auto-generated method stub    
18.         System.out.println(Thread.currentThread().getName());    
19.         while (i < MAX_I) {    
20.             System.out.println(i++);    
21.         }    
22.     }    
23. }    

  运行结果如下: 
Java代码 
1.  main    
2.  Thread-0    
3.  0    
4.  1    
5.  2    
6.  3    
7.  4    
8.  5    
9.  6    
10. 7    
11. 8    
12. Printed by main thread    
13. 9    

  很明显,这才是我们想看到的结果,所以结论是只有调用Thread的start方法,将线程交由JVM控制,才能产生多线程,而直接调用run方法只是一个普通的单线程程式。 
 
分享到:
评论

相关推荐

    行业文档-设计装置-一种打磨成仿牛角尖外形的笔尖.zip

    综上所述,设计打磨成仿牛角尖外形的笔尖是一个融合了艺术、工程和用户需求的复杂过程。它涉及到材料科学、机械加工技术、质量控制以及对用户体验的深刻理解。通过不断的创新和优化,这样的设计可以为用户带来更为...

    牛角包::croissant:轻巧却有用的BukkitSpigotPaper插件库

    介绍Croissant是一个轻量级的Java库,它为Bukkit / Spigot / Paper插件提供了命令框架和GUI框架。 以下是其功能的简短摘要: 命令框架无需在插件的plugin.yml文件中声明命令自动参数解析和制表符补全从推断参数可以...

    OpenOffice 实现JPG.DOC转PDF转SWF在线预览(Java版)

    我们需要在Java项目中引入JODConverter的依赖库,然后创建一个OfficeManager实例,设置OpenOffice的路径和服务端口,接着就可以调用convert方法进行转换操作。例如,将一个DOC文档转换为PDF: ```java Office...

    牛角包:Lu Lua REPL和调试器

    牛角包的Lu Lua REPL提供了一个友好且功能丰富的界面,支持自动补全、语法高亮、错误提示等,大大提升了开发者的编程体验。 2. **调试器的重要性** 调试器是开发者的好朋友,它帮助我们找出程序中的错误和异常。...

    电子:中国半导体:牛角峥嵘.pdf

    在深入解读《电子:中国半导体:牛角峥嵘》这篇报告之前,首先要明确几个核心的概念。首先,半导体是指那些在特定温度下导电性能介于导体和绝缘体之间的材料,常被应用于制造各种电子设备的微小组件中,如晶体管、...

    java注解方式实现拦截接口重复提交

    在这个场景中,"java注解方式实现拦截接口重复提交"是为了解决一个常见的问题:如何避免用户在短时间内多次调用同一接口,导致服务器处理重复请求,可能引发资源浪费或数据不一致。 首先,我们需要定义一个自定义...

    牛角座封装规格

    之前一直在找牛角座等各种插座的规格封装,很难找到,最后找到了

    牛角工具箱源码 轻松打造个性化在线工具箱

    这是一款在线工具箱程序,您可以通过安装扩展增强她的功能 通过插件模板的功能,您也可以把她当做网页导航来使用 环境要求: PHP &gt;= 7.2.5 MySQL &gt;= 5.7 fileinfo扩展 使用Redis缓存需安装Redis扩展 去除禁用函数...

    通达信指标公式源码【黑马启动】捕捉大牛股的牛角!(图、源码).doc

    通达信指标公式源码【黑马启动】捕捉大牛股的牛角!(图、源码).doc

    elasticsearch5.3集成java所需jar包

    在Java开发中,Elasticsearch是一个非常重要的搜索引擎和分析引擎,它基于Lucene构建,提供了分布式、全文检索、实时分析的高性能数据存储解决方案。在Elasticsearch 5.3版本中,为了使其能够正常运行,我们需要集成...

    牛角座接口接线方式及管脚对应

    - **防止误插设计:** 设计中采用了独特的防误插机制,通过在针头端提供一个凸起区域来引导并配合插座上的凸起部分(符合MIL标准),同时插座孔内嵌入定位键以进一步避免误插。 - **适用电缆类型:** 适用的电缆为UL...

    电子:中国半导体:牛角峥嵘.zip

    这篇报告可能深入剖析了中国半导体产业的现状、挑战与机遇,为读者提供了一个全面了解中国在这一高科技领域崛起的视角。通过详细解读这些内容,无论是从业者还是研究者,都能从中获取有价值的信息和洞察。

    牛角弯头三维CAD展开放样.pdf

    1. 三维建模:通过三维CAD软件,可以快速准确地构建出牛角弯头的三维模型,包括每一个圆锥形管节的几何结构。在模型中,能够精确地体现各管节之间的连接关系和角度定位。 2. 展开计算:三维CAD软件可以自动计算每个...

    C++编译的牛角棋

    在这个项目中,我们能够看到开发者如何运用C++的基本语法、控制结构、函数和可能的数据结构来实现一个简单的游戏。下面我们将详细探讨与这个项目相关的C++知识点。 1. **基本语法**:C++是一种静态类型的、编译式的...

    牛角按摩梳使用方法.pdf

    很抱歉,由于提供的文件信息中【部分内容】中仅包含了一串数字,并...如果您能提供更具体的内容或详细说明文件中牛角按摩梳的使用方法,我将很乐意为您生成所需的知识点。请补充相关信息以便我能够准确回答您的需求。

    原牛角源码(修罗bbs)全站程序打包带数据库备份

    原牛角源码(修罗bbs)全站程序打包带数据库备份,牛角源码全站数据+全站文件、插件打包分享给大家,有兴趣的可以搭建玩玩! conf文件夹中自己配置数据库链接文件,默认管理账号:admin,密码123456 首页登录后就可以...

    OUPIIN 牛角接头1001系列端子3d

    而“1001系列”可能指的是该产品线的一个特定型号或规格,这通常涉及到尺寸、载流能力、绝缘材料、耐温性等关键性能指标。 【描述】"OUPIIN 牛角接头1001系列端子3d"的描述虽然简洁,但暗示了该产品可能包含3D模型...

    讯飞星火认知大模型体验方式&测试指南

    例如,要让模型模拟一个成功的创业者准备一份在【某大学开学典礼】上的【知识改变命运】主题演讲大纲,你可以这样提问: - **明确指令**:请你扮演一个成功的创业者,为在【某大学开学典礼】上的演讲准备一份大纲,...

    原牛角源码(修罗bbs)程序打包带数据库备份源码

    - `robots.txt`:这是一个告诉搜索引擎爬虫哪些页面可以抓取,哪些不应抓取的文件,对于SEO(搜索引擎优化)有一定的影响。 - `sitemap.xml`:网站地图文件,列出网站的主要页面,有助于搜索引擎更好地理解和索引...

Global site tag (gtag.js) - Google Analytics