目录

线程的概念及单线程多线程区别

创建多线程——继承线程类

创建多线程——实现Runnable接口

创建多线程——匿名类

总结


线程的概念及单线程多线程区别

首先要理解进程(Processor)和线程(Thread)的区别
进程:我们玩游戏时,启动一个 lol.exe 就叫一个进程。 接着又启动一个 DOTA.exe ,这叫两个进程。
线程:线程是在进程内部同时做的事情,比如在 LOL 里,有很多事情要同时做,比如"盖伦” 击杀“提莫”,同时“赏金猎人”又在击杀“盲僧”,这就是由多线程来实现的。
总的可以这样说:进程是一个事件,线程是具体的动作,比如我们出去玩,玩就是一个进程,而具体 “玩什么”, “怎么玩” 就是线程。

单线程与多线程区别(类比于打游戏):
单线程时,盖伦打提莫,盲僧打亚索两个动作,只能分别进行;
多线程时,盖伦打提莫,盲僧打亚索两个动作,可以同时进行。

  • 我们可以设计一个类Hero,定义变量和攻击方法(attack)
package test;public class Hero {// 定义变量 public String name;public float hp;public int damage;// 定义攻击方法public void attack(Hero h) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}h.hp -= damage;System.out.format("%s 正在攻击  %s, %s 的血变成了 %.0f%n", name, h.name, h.name, h.hp);if(h.isDead()) {System.out.println(h.name + "死了!");}}public boolean isDead() {return hp <= 0 ? true : false;}
}
  • 设计一个类HeroAssignment,实例化Hero对象,并赋值。(注意可以利用构造法赋值)
package test;public class HeroAssignment {public HeroAssignment() {}Hero gareen = new Hero("盖伦", 616, 50);Hero teemo = new Hero("提莫", 300, 30);Hero leesin = new Hero("盲僧", 455, 80);Hero yasuo = new Hero("亚索", 500, 65);
}
  • 在mian函数中,实例化赋值类,并运行 Hero 的 attack方法
    package test;public class mainRun {public static void main(String[] args) {HeroAssignment ha = new HeroAssignment();// 盖伦打提莫while (!ha.teemo.isDead())ha.gareen.attack(ha.teemo);// 盲僧打亚索while (!ha.yasuo.isDead()) {ha.leesin.attack(ha.yasuo);}}
    }
  • 输出结果为:
盖伦 正在攻击  提莫, 提莫 的血变成了 250
盖伦 正在攻击  提莫, 提莫 的血变成了 200
盖伦 正在攻击  提莫, 提莫 的血变成了 150
盖伦 正在攻击  提莫, 提莫 的血变成了 100
盖伦 正在攻击  提莫, 提莫 的血变成了 50
盖伦 正在攻击  提莫, 提莫 的血变成了 0
提莫死了!
盲僧 正在攻击  亚索, 亚索 的血变成了 420
盲僧 正在攻击  亚索, 亚索 的血变成了 340
盲僧 正在攻击  亚索, 亚索 的血变成了 260
盲僧 正在攻击  亚索, 亚索 的血变成了 180
盲僧 正在攻击  亚索, 亚索 的血变成了 100
盲僧 正在攻击  亚索, 亚索 的血变成了 20
盲僧 正在攻击  亚索, 亚索 的血变成了 -60
亚索死了!

创建多线程——继承线程类

  • 设计一个类KillThread继承Thread,并且重写run方法
package test;public class KillThread extends Thread {private Hero h1;private Hero h2;public KillThread(Hero h1, Hero h2) {this.h1 = h1;this.h2 = h2;}@Overridepublic void run() {while (!h2.isDead()) {h1.attack(h2);}}
}

  • 启动线程办法: 实例化一个KillThread对象,并且调用其start方法
package test;public class mainRun {public static void main(String[] args) {// 引入赋值对象HeroAssignment ha = new HeroAssignment();// 实例化对象,并调用start方法KillThread kt1 = new KillThread(ha.gareen, ha.teemo);kt1.start();KillThread kt2 = new KillThread(ha.leesin, ha.yasuo);kt2.start();}
}

  • 输出结果为:(可以看到盲僧攻击亚索的同时,盖伦也在攻击提莫)
盲僧 正在攻击  亚索, 亚索 的血变成了 420
盖伦 正在攻击  提莫, 提莫 的血变成了 250
盖伦 正在攻击  提莫, 提莫 的血变成了 200
盲僧 正在攻击  亚索, 亚索 的血变成了 340
盲僧 正在攻击  亚索, 亚索 的血变成了 260
盖伦 正在攻击  提莫, 提莫 的血变成了 150
盖伦 正在攻击  提莫, 提莫 的血变成了 100
盲僧 正在攻击  亚索, 亚索 的血变成了 180
盲僧 正在攻击  亚索, 亚索 的血变成了 100
盖伦 正在攻击  提莫, 提莫 的血变成了 50
盲僧 正在攻击  亚索, 亚索 的血变成了 20
盖伦 正在攻击  提莫, 提莫 的血变成了 0
提莫死了!
盲僧 正在攻击  亚索, 亚索 的血变成了 -60
亚索死了!

创建多线程——实现Runnable接口

  • 设计一个类KillRunnable实现Runnable接口,并且重写run方法
package test;public class KillRunnable implements Runnable{private Hero h1;private Hero h2;public KillRunnable(Hero h1, Hero h2){this.h1 = h1;this.h2 = h2;}@Overridepublic void run() {while (!h2.isDead()) {h1.attack(h2);}}}
  • 启动线程办法: 实例化一个KillRunnable对象,并且调用其start方法
package test;public class mainRun {public static void main(String[] args) {HeroAssignment ha = new HeroAssignment();KillRunnable kr1 = new KillRunnable(ha.gareen, ha.teemo);new Thread(kr1).start();KillRunnable kr2 = new KillRunnable(ha.leesin, ha.yasuo);new Thread(kr2).start();}
}
  • 输出结果为:(可以看到盲僧攻击亚索的同时,盖伦也在攻击提莫)
盖伦 正在攻击  提莫, 提莫 的血变成了 250
盲僧 正在攻击  亚索, 亚索 的血变成了 420
盲僧 正在攻击  亚索, 亚索 的血变成了 340
盖伦 正在攻击  提莫, 提莫 的血变成了 200
盲僧 正在攻击  亚索, 亚索 的血变成了 260
盖伦 正在攻击  提莫, 提莫 的血变成了 150
盖伦 正在攻击  提莫, 提莫 的血变成了 100
盲僧 正在攻击  亚索, 亚索 的血变成了 180
盲僧 正在攻击  亚索, 亚索 的血变成了 100
盖伦 正在攻击  提莫, 提莫 的血变成了 50
盖伦 正在攻击  提莫, 提莫 的血变成了 0
盲僧 正在攻击  亚索, 亚索 的血变成了 20
提莫死了!
盲僧 正在攻击  亚索, 亚索 的血变成了 -60
亚索死了!

创建多线程——匿名类

  • 继承Thread,重写run方法,直接在run方法中写业务代码
package test;public class mainRun {public static void main(String[] args) {HeroAssignment ha = new HeroAssignment();// 匿名类Thread t1 = new Thread() {@Overridepublic void run() {//匿名类中用到外部的局部变量teemo,必须把teemo声明为final//但是在JDK7以后,就不是必须加final的了while(!ha.teemo.isDead()) {ha.gareen.attack(ha.teemo);}}};t1.start();Thread t2 = new Thread() {@Overridepublic void run() {while(!ha.yasuo.isDead()) {ha.leesin.attack(ha.yasuo);}}};t2.start();}
}
  • 输出结果为:(可以看到盲僧攻击亚索的同时,盖伦也在攻击提莫)
盖伦 正在攻击  提莫, 提莫 的血变成了 250
盲僧 正在攻击  亚索, 亚索 的血变成了 420
盖伦 正在攻击  提莫, 提莫 的血变成了 200
盲僧 正在攻击  亚索, 亚索 的血变成了 340
盲僧 正在攻击  亚索, 亚索 的血变成了 260
盖伦 正在攻击  提莫, 提莫 的血变成了 150
盖伦 正在攻击  提莫, 提莫 的血变成了 100
盲僧 正在攻击  亚索, 亚索 的血变成了 180
盲僧 正在攻击  亚索, 亚索 的血变成了 100
盖伦 正在攻击  提莫, 提莫 的血变成了 50
盖伦 正在攻击  提莫, 提莫 的血变成了 0
盲僧 正在攻击  亚索, 亚索 的血变成了 20
提莫死了!
盲僧 正在攻击  亚索, 亚索 的血变成了 -60
亚索死了!

总结

  1. 实现Runnable接口的线程类,还可以继承其他类。实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。但是编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

  2. 继承Thread的线程类编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程,但不能再继承其他父类(Java单继承决定)。

  3. 启动线程是start()方法,run()并不能启动一个新的线程

start()和run()的区别

  • start()方法用来,开启线程,但是线程开启后并没有立即执行,他需要获取cpu的执行权才可以执行
  • run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)

创建多线程的几种方法介绍相关推荐

  1. Python创建多线程的三种方法

    Python创建多线程的三种方法 thread模块函数式创建线程 继承threading类创建多线程 threading模块函数式创建线程 使用总结 thread模块函数式创建线程 调用thread模 ...

  2. Qt创建多线程的两种方法

    来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run ...

  3. python3创建多线程的几种方法

    python3创建多线程主要有下面两种方法:函数.类 1.函数创建多线程 python3中,提供了一个内置模块threading.Thread,可以很方便的创建多线程,threading.Thread ...

  4. 创建多线程有几种方法?如何创建线程?

    多线程有几种实现方法? 多线程实现又3种方法,其中前两中是常用的方法,推荐第二种方法,一个类应该在其修改或者加强是才继承 1.继承Thread类,重写run()方法,实例化该类,调用线程start() ...

  5. threading模块使用_threading简介(创建多线程的两种方法)★

    #####一.什么是threading? **threading是一个创建多线程的库(调用threading库的threading.Thread方法)** **语法为**```threading.Th ...

  6. Java创建多线程的三种方法

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  7. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  8. 创建线程的七种方法 (图解 全网最全最详细)

    本文创建于 2021年5月14日 作者:Xiang 参考文献:创建多线程的四种方法 创建线程的8种方法 创建匿名线程的5种方法 特别鸣谢 文章目录 1.什么是多线程 2.线程状态 3.线程同步方法 4 ...

  9. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

最新文章

  1. 如何避免重复提交?分布式服务的幂等性设计!
  2. linux shell install 命令简介
  3. mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
  4. OpenStack技术峰会PPT集萃
  5. 工信部王卫明:我国5G研发开局良好
  6. 蓝牙BLE LINK LAYER剖析(二) -- PDU
  7. ajax数据传送中文乱码,springmvc 发送ajax出现中文乱码的解决方法汇总
  8. 轻量级锁的加锁和解锁逻辑-自旋锁
  9. NYOJ---540奇怪的排序
  10. 【HDU - 1285】确定比赛名次 (拓扑排序)
  11. ca开头的车是什么牌子_微电调研 | 把高速车摘了牌子当低速车卖还很普遍
  12. 20170513 Python练习册0011过滤敏感词
  13. [转载] java向匿名内部类传递参数
  14. 机器学习笔记(二十五):支撑向量机(SVM)
  15. logistic回归分析优点_糖尿病前期患者焦虑现状调查及影响因素分析
  16. mt7621 openwrt19.07 打开uart3
  17. java里面的斜杠是什么意思_java 单斜杠
  18. socket can 编程
  19. Global land use changes are four times greater than previously estimated
  20. 物联网案例(二):物联网系统如何进行实时决策

热门文章

  1. 【Unity3D插件】RuntimeTransformGizmos插件分享《Unity运行时控制模型插件》
  2. 系统盘从机械迁移至固态
  3. RMAN备份数据库_备份RMAN备份(Backing Up RMAN Backups)
  4. SAP中内部订单删除问题处理分析实例
  5. Revit的顶点法线及threejs渲染圆弧面的渐变亮度
  6. python爬虫登录教程_18个网站的Python爬虫登录示例 | 开源项目推荐|python教程|python入门|python教程...
  7. vue tree组件_基于 Vue2.0 和 HeyUI 组件库的中后端系统 HeyUI Admin
  8. 【天光学术】计算机论文:计算机技术在建筑项目管理中的应用(节选)
  9. 洛谷P5714-肥胖问题
  10. 为什么笔记本电脑wifi图标不见了?——WLAN连接被禁用