Thread的run()与start()的区别

Java中thread的start()和run()的区别:

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,

 

2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。

 

举例说明一下:

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//这是方法调用,而不是开启一个线程
Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();

for(int i=0;i<100;i++){
System.out.println("进入Main Thread运行状态");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
public void run(){

for(int i=0;i<100;i++){
System.out.println("进入Runner1运行状态");
System.out.println(i);
}
}
}

同时摘取一段外文网站论坛上的解释:
Why do we need start() method in Thread class? In Java API description for Thread class is written : "Java Virtual Machine calls the run method of this thread..".

Couldn't we call method run() ourselves, without doing double call: first we call start() method which calls run() method? What is a meaning to do things such complicate?



 

There is some very small but important difference between using start() and run() methods. Look at two examples below:

Example one:

Code:

Thread one = new Thread();
Thread two = new Thread();
one.run();
two.run();

Example two:

Code:

Thread one = new Thread();
Thread two = new Thread();
one.start();
two.start();

The result of running examples will be different.

In Example one the threads will run sequentially: first, thread number one runs, when it exits the thread number two starts.

In Example two both threads start and run simultaneously.

Conclusion: the start() method call run() method asynchronously (does not wait for any result, just fire up an action), while we run run() method synchronously - we wait when it quits and only then we can run the next line of our code.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?

云计算是一种业务模式&#xff0c;服务提供商在定制的环境中处理客户的完整基础架构和软件需求。随着云计算的发展&#xff0c;云服务和解决方案也将随之增长。 软件即服务(SaaS)预计到2020年将以18%的年均复合增长率增长&#xff0c;平台即服务(PaaS)的采用率将在2020年达到56…

C# list删除 另外list里面的元素_在Python 中 List 操作 9种例子详细了解

list的操作有循环、切片、增、删、改、查、反转、排序&#xff1b;接下来我们逐个来说一下&#xff1b;首先我们要知道&#xff0c;列表的索引&#xff08;下标&#xff09;从0开始&#xff0c;最后一个可以用-1表示。1. 循环如果直接for 循环一个list 的时候&#xff0c;那么每…

乱码

程序读入或输出乱码&#xff0c;检查文件的编码方式utf-8或是gbk等&#xff1b;检查程序的解码方式是否与文件的编码方式相同

hadoop矩阵乘法源码_使用Hadoop计算共现矩阵

hadoop矩阵乘法源码这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列。 这次&#xff0c;我们将从文本语料库创建单词共现矩阵。 本系列以前的文章是&#xff1a; 使用MapReduce进行数据密集型文本处理 使用MapReduce进行数据密集型文本处理-本…

第六章 数组和索引器 (6.6 索引器)

【案例】本案例在Student类中定义索引器&#xff0c;然后通过stu[i] 来引用Student类的对象实例。 【案例目的】(1)掌握索引器定义与使用。 (2)理解索引器与属性的区别。 【代码】 namespace Example1 {class Program{static void Main(string[] args){Student stu new Studen…

Java Executors(线程池)

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

matlab 小括号

大括号 用于单元阵列的赋值 中括号 用于形成一个向量或矩阵小括号 通常用于一般的算术表达式,指示优先运算,还用于表示函数变量、向量下标和矩阵下标等到 小括号&#xff0c;用于引用数组的元素。 如 X(3)就是X的第三个元素。 X([1 2 3])就是X的头三个元素。 算例&#xff1a;…

如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...

【新智元导读】ICLR 2019一篇论文指出&#xff1a;DNN解决ImageNet时的策略似乎比我们想象的要简单得多。这个发现使我们能够构建更具解释性和透明度的图像分类管道&#xff0c;同时也解释了现代CNN中观察到的一些现象。全文约3300字6图&#xff0c;读完可能需要10分钟CNN非常擅…

【小记】-006--关于高度塌陷的问题

最近遇到一个问题&#xff1a;当使用 position:absolute 时&#xff0c;给父元素添加 position:relative 父元素高度塌陷&#xff0c;此时如何使得父元素的高度被子元素撑开&#xff1f; 我了解到的高度塌陷无非就是&#xff1a;float属性,display:absolute/fixed属性 float与d…

StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时&#xff0c;通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势&#xff0c;但我经常在我知道对性能影响不大的地方对其进行更改。 我认为&#xff0c;除了可能带来性能收益外&#xff0c;还应出于各种原因进行更改…

matlab 大括号

大括号&#xff0c;用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>

J2EE项目代码编写规范分享

码编写规范目的&#xff1a;能够在编码过程中实现规范化&#xff0c;为以后的程序开发中养成良好的行为习惯。 代码编写规范使用范围&#xff1a;J2EE项目开发。 包命名规范&#xff1a; 目的&#xff1a;包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范&am…

Socket套接字 =======================

http://www.cndartlang.com/841.html 转载于:https://www.cnblogs.com/pythonClub/p/10732555.html

matlab 中括号

中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是个2*3的矩阵. 分号(;)用来结束一行。 中括号的另一个作用是在函数中&#xff0c;分配输出参数。 Matlab 方括号“[ ]”的作用 1定义矩阵&#xff…

mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

转载地址&#xff1a;阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com说一下mysql比较宏观的面试&#xff0c;具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题&#xff0c;这里主要说的索引和BTree结构&#xff0c;很少提到我们的集群配…

详解SQL中drop、delete和truncate的异同

第一&#xff1a;相同点&#xff1a; truncate和不带where子句的delete&#xff0c;以及drop 都会删除表内的数据 第二&#xff1a;不同点&#xff1a; 1. truncate和delete只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigg…

2039 三角形

三角形 http://acm.hdu.edu.cn/showproblem.php?pid2039 1 #pragma warning(disable:4996) 2 #include<stdio.h>3 int main()4 {5 int n;6 double a, b, c;7 while (scanf("%d", &n) ! EOF)8 {9 for (int i 0; i < n; i) 10 …

java正则表达式用法示例_Java正则表达式教程及示例

java正则表达式用法示例当我开始使用Java时&#xff0c;正则表达式对我来说是一场噩梦。 本教程旨在帮助您掌握Java正则表达式&#xff0c;并让我定期返回以刷新我的正则表达式学习。 什么是正则表达式&#xff1f; 正则表达式定义字符串的模式。 正则表达式可用于搜索&#…

查看ip

查看 http://httpbin.org/ip

Python中表示偶数_蒙特卡洛模拟(Python)深入教程

译者&#xff1a;大表哥、wiige来源&#xff1a;AI研习社什么是蒙特卡罗模拟&#xff1f;蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。蒙特卡罗模拟或概率模拟是一种技术&#xff0c;用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影…