线程创建两种方式

方式一(继承于Thread类)

  1. 创建一个继承于Thread类的子类
  2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中
  3. 创建Thread类的子类的对象
  4. 通过此对象调用start()
package com.wdl.java;//1. 创建一个继承于Thread类的子类
class MyThread extends Thread {//2. 重写Thread类的run()@Overridepublic void run() {for (int i = 0; i < 100; i++) {if(i % 2 == 0){System.out.println(Thread.currentThread().getName() + ":" + i);}}}
}public class ThreadTest {public static void main(String[] args) {//3. 创建Thread类的子类的对象MyThread t1 = new MyThread();//4.通过此对象调用start():①启动当前线程 ② 调用当前线程的run()t1.start();//问题一:我们不能通过直接调用run()的方式启动线程。相当于直接调用run方法
//        t1.run();//问题二:再启动一个线程,遍历100以内的偶数。不可以还让已经start()的线程去执行。会报IllegalThreadStateException
//        t1.start();//我们需要重新创建一个线程的对象MyThread t2 = new MyThread();t2.start();//如下操作仍然是在main线程中执行的。for (int i = 0; i < 100; i++) {if(i % 2 == 0){System.out.println(Thread.currentThread().getName() + ":" + i + "***********main()************");}}}}

方式二(实现Runnable接口)

  1. 创建一个实现了Runnable接口的类
  2. 实现类去实现Runnable中的抽象方法:run()
  3. 创建实现类的对象
  4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
  5. 通过Thread类的对象调用start()

在这里插入图片描述

package com.wdl.java;//1. 创建一个实现了Runnable接口的类
class MThread implements Runnable{//2. 实现类去实现Runnable中的抽象方法:run()@Overridepublic void run() {for (int i = 0; i < 100; i++) {if(i % 2 == 0){System.out.println(Thread.currentThread().getName() + ":" + i);}}}
}public class ThreadTest1 {public static void main(String[] args) {//3. 创建实现类的对象MThread mThread = new MThread();//4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象Thread t1 = new Thread(mThread);t1.setName("线程1");//5. 通过Thread类的对象调用start():① 启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()t1.start();//再启动一个线程,遍历100以内的偶数Thread t2 = new Thread(mThread);t2.setName("线程2");t2.start();}}

比较

这两种方式调用的都是Thread类里面的start方法

开发中:优先选择:实现Runnable接口的方式
原因:1. 实现的方式没有类的单继承性的局限性

    2. 实现的方式更适合来处理多个线程有共享数据的情况。联系:public class Thread implements Runnable相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。

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

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

相关文章

在ASP.NET CORE 2.0使用SignalR技术

一、前言 上次讲SignalR还是在《在ASP.NET Core下使用SignalR技术》文章中提到&#xff0c;ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划中。时间过得很快&#xff0c;MS已经发布了.NET Core 2.0 Preview 2 预览版&#xff0c;距离正式版已经不远了&#xf…

java中常见的几种内部类,你会几个?(未完)

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;今天给大家介绍的是java中的几种内部类。java中常见的几个内部类&#xff0c;你会几个&#xff1f;我会四个&#xff01;在看每个新知识点时&#xff0c;我们不禁有这样或者那样的疑问&#xff0c;比如…

通俗理解信息熵

转载自 通俗理解信息熵 通俗理解信息熵 前段时间德川和我讲解了决策树的相关知识&#xff0c;里面德川说了一下熵&#xff0c;今天整理了一下&#xff0c;记录下来希望对大家理解有帮助~ 1、信息熵的公式 先抛出信息熵公式如下&#xff1a; 其中代表随机事件X为的概率&…

.NET Core 2.0 Preview 2为开发人员带来改进

Microsoft发布了.NET Core 2第二个预览版&#xff08;Preview 2&#xff09;&#xff0c;该版本可用于Mac OS X、Linux和Windows平台。Preview 2首次给出了对所有平台上各种软件包和安装程序的统一命名模式。所有的运行时文件将以"dotnet-运行时名称”命名&#xff0c;而S…

java中,剩下的这两个内部类不太好理解!

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;今天我们接着昨天的分享&#xff0c;将剩余的两个内部类&#xff08;方法内部类和匿名内部类&#xff09;结束掉&#xff0c;这两个内部类都不太好理解。昨天的推文&#xff1a;java中常见的几种内部类…

【jzoj】2018.2.3NOIP普及组——D组模拟赛

前言 万年D组系列… 正题 题目1&#xff1a;数池塘&#xff08;jzoj1898&#xff09; 有一个地方有一些积水&#xff0c;连着的积水是一个池塘&#xff0c;求池塘数。 输入 第1行&#xff1a;由空格隔开的两个整数&#xff1a;N和M 第2..N1行&#xff1a;每行M个字符代表…

通俗理解条件熵

转载自 通俗理解条件熵 通俗理解条件熵 前面我们总结了信息熵的概念通俗理解信息熵,这次我们来理解一下条件熵。 1、信息熵以及引出条件熵 我们首先知道信息熵是考虑该随机变量的所有可能取值&#xff0c;即所有可能发生事件所带来的信息量的期望。公式如下&#xff1a; 我…

WebAssembly:随风潜入夜

What&#xff1f; WebAssembly 是一种二进制格式的类汇编代码&#xff0c;可以被浏览器加载和并进一步编译成可执行的机器码&#xff0c;从而在客户端运行。它还可以作为高级语言的编译目标&#xff0c;理论上任何语言都可以编译为 WebAssembly。 我们知道汇编语言就是机器码的…

让java的多重继承成为现实!

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;前两天给大家说了说java中的四种内部类&#xff0c;推文分别为&#xff1a;静态内部类和成员内部类方法内部类和匿名内部类在内部类的基础上&#xff0c;我们来看看今天的知识点儿。众所周知&#xff0…

通俗理解决策树算法中信息增益的

转载自 通俗理解决策树算法中信息增益的 通俗理解决策树算法中的信息增益 在决策树算法的学习过程中&#xff0c;信息增益是特征选择的一个重要指标&#xff0c;它定义为一个特征能够为分类系统带来多少信息&#xff0c;带来的信息越多&#xff0c;说明该特征越重要&#x…

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体&#xff0c;你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时&#xff0c;比如Entity Framework&#xff0c;实体作为直接反映数据库表结构的对象&#xff0c;就更尤为重要。特别是当我们使用EF Code First时&#xf…

班级日常 | 一天一瞬间!

点击上方蓝色关注我们&#xff01;欢迎来到今天的“一天一瞬间”专栏在学习word操作时&#xff0c;同学们的兴趣还是较高的&#xff0c;但是&#xff0c;比起“一天一个黑科技”来说&#xff0c;还是差了许多&#xff01;前面两天都是学的一些简单的DOS命令&#xff0c;比如进某…

ASP.NET Core Web 资源打包与压缩

本文将介绍使用的打包和压缩的优点&#xff0c;以及如何在ASP.NET Core应用程序中使用这些功能。 概述 在ASP.Net中可以使用打包与压缩这两种技术来提高Web应用程序页面加载的性能。通过减少从服务器请求的次数和减少资源文件的体积来提高加载性能。 打包是一地将多个文件&a…

班级日常分享 | 一天一瞬间!

点击上方蓝色关注我们&#xff01;介于最近同学们的学习劲头十足的样子&#xff0c;我和丁老师商量决定晚上不布置作业&#xff0c;看一部电影放松放松&#xff01;昨晚下晚自习后&#xff0c;零零散散的还有一部分同学在教室里面学习&#xff0c;值班老师都催促多次&#xff0…

句法分析(syntactic parsing)在NLP领域的应用是怎样的

转载自 句法分析&#xff08;syntactic parsing&#xff09;在NLP领域的应用是怎样的 句法分析&#xff08;syntactic parsing&#xff09;在NLP领域的应用是怎样的&#xff1f; 文章整理自郭江师兄问题回答&#xff08;被收录于知乎编辑推荐&#xff09;&#xff01;已取得…

新的学期、新的开始、新的付出、新的收获!

点击上方蓝色关注我们&#xff01;本文原创&#xff1a;王晓丹同学初次&#xff0c;我漫步在静静的校园&#xff0c;深情的黄昏&#xff0c;显得格外惹人喜爱。哇&#xff01;那是什么&#xff1f;我情不自禁的喊了出来&#xff0c;一颗石榴树 &#xff0c;引起了我满满的回忆&…

ASP.NET Core Web API 最小化项目

ASP.NET Core中默认的ASP.NET Core 模板中有Web API 模板可以创建Web API项目。 有时&#xff0c;只需要创建一个API&#xff0c;不需要关心Razor&#xff0c;本地化或XML序列化。通过删除无用的NuGet软件包和代码&#xff0c;可以提高 API 的加载时间并减少部署包大小。 新建…

LinkedHashSet VS HashSet

LinkedHashSet的使用 LinkedHashSet作为HashSet的子类&#xff0c;在添加数据的同时&#xff0c;每个数据还维护了两个引用&#xff0c;记录此数据前一个 数据和后一个数据。 优点&#xff1a;对于频繁的遍历操作&#xff0c;LinkedHashSet效率高于HashSet

隐马尔科夫模型-基本模型与三个基本问题

转载自 隐马尔科夫模型-基本模型与三个基本问题 隐马尔科夫模型-基本模型与三个基本问题 这次学习会讲了隐马尔科夫链&#xff0c;这是一个特别常见的模型&#xff0c;在自然语言处理中的应用也非常多。 常见的应用比如分词&#xff0c;词性标注&#xff0c;命名实体识别等…