0、目录

  • 1、多线程
  • 2、线程概念
  • 3、创建多线程-继承线程类
  • 4、创建多线程-实现Runnable接口
  • 5、创建多线程-匿名类
  • 6、创建多线程的三种方式
  • 7、参考链接

1、多线程

多线程即在同一时间,可以做多件事情。

创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类

2、线程概念

首先要理解进程(Processor)和线程(Thread)的区别
进程:启动一个LOL.exe就叫一个进程。 接着又启动一个DOTA.exe,这叫两个进程。

线程:线程是在进程内部同时做的事情,比如在LOL里,有很多事情要同时做,比如"盖伦” 击杀“提莫”,同时“赏金猎人”又在击杀“盲僧”,这就是由多线程来实现的。

  • Hero.java
package charactor;import java.io.Serializable;public class Hero{public String name;public float hp;public int damage;public void attackHero(Hero h) {try {//为了表示攻击需要时间,每次攻击暂停1000毫秒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 0>=hp?true:false;}}
  • TestThread.java
package multiplethread;import charactor.Hero;public class TestThread {public static void main(String[] args) {Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 616;gareen.damage = 50;Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 300;teemo.damage = 30;Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 500;bh.damage = 65;Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 455;leesin.damage = 80;//盖伦攻击提莫while(!teemo.isDead()){gareen.attackHero(teemo);}//赏金猎人攻击盲僧while(!leesin.isDead()){bh.attackHero(leesin);}}}

3、创建多线程-继承线程类

使用多线程,就可以做到盖伦在攻击提莫的同时,赏金猎人也在攻击盲僧
设计一个类KillThread 继承Thread,并且重写run方法
启动线程办法: 实例化一个KillThread对象,并且调用其start方法
就可以观察到 赏金猎人攻击盲僧的同时,盖伦也在攻击提莫

  • KillThread.java
package multiplethread;import charactor.Hero;public class KillThread extends Thread{private Hero h1;private Hero h2;public KillThread(Hero h1, Hero h2){this.h1 = h1;this.h2 = h2;}public void run(){while(!h2.isDead()){h1.attackHero(h2);}}
}
  • TestThread.java
package multiplethread;import charactor.Hero;public class TestThread {public static void main(String[] args) {Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 616;gareen.damage = 50;Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 300;teemo.damage = 30;Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 500;bh.damage = 65;Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 455;leesin.damage = 80;KillThread killThread1 = new KillThread(gareen,teemo);killThread1.start();KillThread killThread2 = new KillThread(bh,leesin);killThread2.start();}}

4、创建多线程-实现Runnable接口

创建类Battle,实现Runnable接口
启动的时候,首先创建一个Battle对象,然后再根据该battle对象创建一个线程对象,并启动

Battle battle1 = new Battle(gareen,teemo);
new Thread(battle1).start();

battle1 对象实现了Runnable接口,所以有run方法,但是直接调用run方法,并不会启动一个新的线程。
必须,借助一个线程对象的start()方法,才会启动一个新的线程。
所以,在创建Thread对象的时候,把battle1作为构造方法的参数传递进去,这个线程启动的时候,就会去执行battle1.run()方法了。

  • Battle.java
package multiplethread;import charactor.Hero;public class Battle implements Runnable{private Hero h1;private Hero h2;public Battle(Hero h1, Hero h2){this.h1 = h1;this.h2 = h2;}public void run(){while(!h2.isDead()){h1.attackHero(h2);}}
}
  • TestThread.java
package multiplethread;import charactor.Hero;public class TestThread {public static void main(String[] args) {Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 616;gareen.damage = 50;Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 300;teemo.damage = 30;Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 500;bh.damage = 65;Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 455;leesin.damage = 80;Battle battle1 = new Battle(gareen,teemo);new Thread(battle1).start();Battle battle2 = new Battle(bh,leesin);new Thread(battle2).start();}}

5、创建多线程-匿名类

使用匿名类,继承Thread,重写run方法,直接在run方法中写业务代码
匿名类的一个好处是可以很方便的访问外部的局部变量。
前提是外部的局部变量需要被声明为final。(JDK7以后就不需要了)

package multiplethread;import charactor.Hero;public class TestThread {public static void main(String[] args) {Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 616;gareen.damage = 50;Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 300;teemo.damage = 30;Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 500;bh.damage = 65;Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 455;leesin.damage = 80;//匿名类Thread t1= new Thread(){public void run(){//匿名类中用到外部的局部变量teemo,必须把teemo声明为final//但是在JDK7以后,就不是必须加final的了while(!teemo.isDead()){gareen.attackHero(teemo);}              }};t1.start();Thread t2= new Thread(){public void run(){while(!leesin.isDead()){bh.attackHero(leesin);}              }};t2.start();}}

6、创建多线程的三种方式

把上述3种方式再整理一下:

  1. 继承Thread类
  2. 实现Runnable接口
  3. 匿名类的方式

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

7、参考链接

【01】How2j - 多线程

293、Java中级10 -【多线程】 2020.03.31相关推荐

  1. JAVA 笔记 10 多线程

    进程 与 线程 进程 进程资源分配的最小单位,CPU从磁盘中读取一段程序到内存中,该执行程序的实例就叫做进程; 一个程序如果被CPU多次读取到内存中,则变成多个独立的进程. 线程 线程是程序执行的最小 ...

  2. Java SE - 10 - 多线程

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. 线程的概述 2.多线程的创建与使用 2.1 方式一:继承的方式开启线程 2.2 方式二:实现Runnable接口方式开 ...

  3. JAVA中级之多线程

    多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 线程概念 首先要理解进程(Processor)和线程(Thread)的区别 进程:启动一 ...

  4. java抽象类与接口5.4-5.7 2020.3.31

    5-4-抽象类的应用 1.2.5.7不变,3.4.6不同,3.查询对象不同语句对象就不同,3.查到的对象不同,4的参数就可能不同,6字段也不同 1.2.5.6不变 3.4 不同 5-5-接口声明及实现 ...

  5. Java— 齐头并进完成任务—多线程

    感知多线程 Java是少数的几种支持"多线程"的语言之一.大多数的程序语言只能循序运行单独的一个程序块,无法同时运行不同的多个程序块.Java的"多线程"恰可弥 ...

  6. Java中级开发面试题

    面试题: HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 Spring的AOP和IOC是什么?使用场景有哪些?Spring事务,事务的 ...

  7. java 中级面试题及答案

    java 中级面试题及答案 1.MyBatis中,根据Id查询单个Order对象,动态SQL如何编写? A. SELECT * FROM Order WHERE ID = #{id}; B. SELE ...

  8. Java回顾之多线程

    在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信,我们把线程同步的话题留到下一篇文章中. 线程是操作系统运 ...

  9. JAVA中的多线程(一)

    JAVA中的多线程(一) 进程:是一个正在执行中的程序 每一个进程执行都有一个执行的顺序,该顺序是一个执行路径,或者叫控制单元 线程:就是进程中的一个独立的控制单元 线程在控制着进程的执行 一个进程中 ...

最新文章

  1. linux的tar中ztvf,linux中的tar命令(2)
  2. mysql5.6的安装步骤_MySQL5.6安装步骤
  3. 推荐一个短小精干的JavaScript对话框
  4. socket编程TCP通信
  5. 原码 反码 补码 详解
  6. Python set集合 - Python零基础入门教程
  7. Think in AngularJS :对比 jQuery 和 AngularJS 的不同思维模式
  8. python爬虫判断cookie过期_当爬虫遇到cookie失效,怎样处理?
  9. ubuntu python3.7 gblic问题_glibc
  10. [FJWC2018]欧拉函数
  11. 网线RJ45接口针脚
  12. 7.0高等数学五-高斯公式
  13. round在oracle中的作用,oracle中round函数的使用
  14. 实景三维社区网格化平台,让管理精准!快速!高效!
  15. JSON 数据结构、数据格式
  16. QList(增删改查)示例
  17. 怎么查看当前登录的svn账号_svn 用户名,密码 查看/删除方法
  18. linux系统的文件系统管理
  19. 异或和同或之间的转换
  20. 一些小技巧,想起来了就码上!

热门文章

  1. 复习笔记1-java基础
  2. Excel 数据统计小技巧
  3. 操作系统之——磁盘存储器管理
  4. seo搜索引擎优化-SEO优化教程附关键词工具以及文章采集软件
  5. 计算机内部组成原理及内部子系统概述
  6. APP微信支付报错《商户号该产品权限未开通,请前往商户平台产品中心检查后重试》
  7. Python unrar解压rar压缩文件
  8. 笔记本电脑f11功能键_电脑f11键是什么作用
  9. android 方向键 按钮,这不科学!安卓虚拟按键、实体键谁更好?
  10. 人脸识别——基于CNN的模型实现