Java 线程的run()和start()

一个常见的问题:为什么启动线程是调用start()方法,而不是调用run()方法呢?

答案:

每个线程都在单独的调用堆栈中启动。

从主线程调用run()方法,run()方法转到当前调用堆栈,而不是新调用堆栈的开头。

如下面例子所示:

package com.yiidian;

/**

* 一点教程网: http://www.yiidian.com

*/

/**

* 启动线程的错误示范

*/

class Demo extends Thread{

public void run(){

System.out.println("running...");

}

public static void main(String args[]){

Demo t1=new Demo();

t1.run();//这样调用不回启动单独的调用堆栈

}

}

输出结果为:

running...

以上程序Demo的run()线程方法和Demo的main()方法都是处于主线程中,换句话说,这里并没有创建新的线程。

如果直接调用run()方法,则会出现问题。如下所示:

package com.yiidian;

/**

* 一点教程网: http://www.yiidian.com

*/

/**

* 启动线程的错误示范

*/

class Demo extends Thread{

public void run(){

for(int i=1;i<5;i++){

try{

Thread.sleep(500);

}catch(InterruptedException e){

System.out.println(e);

}

System.out.println(i);

}

}

public static void main(String args[]){

Demo t1=new Demo();

Demo t2=new Demo();

t1.run();

t2.run();

}

}

1

2

3

4

1

2

3

4

正如在上面的程序中看到的那样,程序执行并没有上下文切换,因为这里t1和t2将被视为普通对象而不是线程对象

java 多线程 start,Java 线程的run()和start()相关推荐

  1. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  2. Java多线程之守护线程实战

    转载自 Java多线程之<<守护线程>>实战 定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护线程才会跟着结束 ...

  3. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  4. Java多线程:捕获线程异常

    你处理过多线程中的异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗? 除了try catch.Java中还可以通过异常处理器UncaughtExceptionHand ...

  5. Java多线程-新特性-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  6. java多线程问题,线程交替执行

    两个线程,一个打印1-100的奇数,一个打印1-100的偶数:要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环. package threadtest;publ ...

  7. Java多线程编程(3)--线程安全性

    一.线程安全性   一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...

  8. java多线程示例_Java线程示例

    java多线程示例 Welcome to the Java Thread Example. Process and Thread are two basic units of execution. C ...

  9. 【Java多线程】Java线程状态及转换方法详解

    文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...

最新文章

  1. 使用UEFI模式安装win10中的格式化磁盘问题
  2. Could not download lint-gradle.jar (com.android.tools.lint:lint-gradle:26.4.
  3. TTCN手动测试总结
  4. android 内部存储 清空,Android清空应用内部文件缓存
  5. usestate中的回调函数_React 中获取数据的 3 种方法:哪种最好?
  6. (笔试题)和0交换的排序
  7. python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...
  8. click group实例
  9. alias自定义别名
  10. linux zip unzip 命令
  11. 路由器手机测试网速的软件,4个实用的无线路由器WiFi检测工具,让你网速又快又稳定...
  12. UESTC - 59 数据大搜索
  13. Windows文件系统-NTFS文件系统
  14. 小学生计算机知识技能竞赛,2016年春季小学生六项技能竞赛计算机试卷.doc
  15. 【记录】好用的字体识别工具(网站)
  16. flask Not Found The requested URL 20211207
  17. 链表的中间结点--快慢指针思想
  18. 四.Redis学习:特殊数据类型
  19. FFmpeg命令行工具系列二---转码流程及过滤器
  20. 推荐使用:易企在线客服升级版

热门文章

  1. 读《UNIX编程艺术》随记
  2. 请教SQL对日期格式化的写法
  3. linux运维最小化安装cacti,Linux监控和安全运维--cacti安装部署
  4. golang类型断言及检测其是否断言成功
  5. vue指令:v-cloak渲染指令(v-cloak 指令是解决屏幕闪动的好方法)
  6. go gin框架:请求静态图片资源(可用于搭建图床等应用)
  7. HDFS restful API:关于WebHDFS与HttpFS的区别
  8. 使用 Sealos + Longhorn 部署 KubeSphere v3.0.0
  9. scala函数定义示例
  10. 操作系统里的内存碎片的解决办法