一、 什么是多线程:

我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。

多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源);
多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;
主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;

二、程序,进程,线程以及并发、并行的概念

程序:是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象。
进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有它自身的产生,存在和消亡的过程。-------生命周期
线程:进程可进一步细化为线程,是一个程序内部的一条执行路径

并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事
并发:一个CPU(采用时间片)同时执行多个任务,比如秒杀平台,多个人做同件事

程序:静态的代码,进程:动态执行的程序,线程:进程中要同时干几件事时,每一件事的执行路径成为线程。一个程序可以有多个线程。

三、多线程的准备知识

1.线程相关API

//获取当前线程的名字
Thread.currentThread().getName()

1.start():1.启动当前线程2.调用线程中的run方法
2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
3.currentThread():静态方法,返回执行当前代码的线程
4.getName():获取当前线程的名字
5.setName():设置当前线程的名字
6.yield():主动释放当前线程的执行权
7.join():在线程中插入执行另一个线程,该线程被阻塞,直到插入执行的线程完全执行完毕以后,该线程才继续执行下去
8.stop():过时方法。当执行此方法时,强制结束当前线程。
9.sleep(long millitime):线程休眠一段时间
10.isAlive():判断当前线程是否存活

2.线程的调度

调度策略:
时间片:线程的调度采用时间片轮转的方式
抢占式:高优先级的线程抢占CPU
Java的调度方法:
1.对于同优先级的线程组成先进先出队列(先到先服务),使用时间片策略
2.对高优先级,使用优先调度的抢占式策略

3.线程的优先级

等级:
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5

方法:
getPriority():返回线程优先级
setPriority(int newPriority):改变线程的优先级

注意!高优先级的线程要抢占低优先级的线程的cpu的执行权。但是仅是从概率上来说的,高优先级的线程更有可能被执行。并不意味着只有高优先级的线程执行完以后,低优先级的线程才执行。

四、创建多线程的两种常用方法

方式1:继承于Thread类

1.创建一个集成于Thread类的子类 (通过ctrl+o(override)输入run查找run方法)
2.重写Thread类的run()方法
3.创建Thread子类的对象
4.通过此对象调用start()方法

例如多窗口售票问题:

 package com.example.paoduantui.Thread;import android.view.Window;/**** 创建三个窗口卖票,总票数为100张,使用继承自Thread方式* 用静态变量保证三个线程的数据独一份* * 存在线程的安全问题,有待解决** */public class ThreadDemo extends Thread{public static void main(String[] args){window t1 = new window();window t2 = new window();window t3 = new window();t1.setName("售票口1");t2.setName("售票口2");t3.setName("售票口3");t1.start();t2.start();t3.start();}}class window extends Thread{private static int ticket = 100; //将其加载在类的静态区,所有线程共享该静态变量@Overridepublic void run() {while(true){if(ticket>0){//                try {//                    sleep(100);//                } catch (InterruptedException e) {//                    e.printStackTrace();//                }System.out.println(getName()+"当前售出第"+ticket+"张票");ticket--;}else{break;}}}}

其中start与run方法的区别:
start方法的作用:1.启动当前线程 2.调用当前线程的重写的run方法(在主线程中生成子线程,有两条线程)
调用start方法以后,一条路径代表一个线程,同时执行两线程时,因为时间片的轮换,所以执行过程随机分配,且一个线程对象只能调用一次start方法。
run方法的作用:在主线程中调用以后,直接在主线程一条线程中执行了该线程中run的方法。(调用线程中的run方法,只调用run方法,并不新开线程)

总结:我们不能通过run方法来新开一个线程,只能调用线程中重写的run方法(可以在线程中不断的调用run方法,但是不能开启子线程,即不能同时干几件事),start是开启线程,再调用方法(即默认开启一次线程,调用一次run方法,可以同时执行几件事)

方式2:实现Runable接口方式

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

例如多窗口售票问题

package com.example.paoduantui.Thread;public class ThreadDemo01 {public static  void main(String[] args){window1 w = new window1();//虽然有三个线程,但是只有一个窗口类实现的Runnable方法,由于三个线程共用一个window对象,所以自动共用100张票Thread t1=new Thread(w);Thread t2=new Thread(w);Thread t3=new Thread(w);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}}class window1 implements Runnable{private int ticket = 100;@Overridepublic void run() {while(true){if(ticket>0){//                try {//                    sleep(100);//                } catch (InterruptedException e) {//                    e.printStackTrace();//                }System.out.println(Thread.currentThread().getName()+"当前售出第"+ticket+"张票");ticket--;}else{break;}}}}

两种常用方法的比较

开发中,优先选择实现Runable接口的方式。原因如下:

区别:
1:实现的方式没有类的单继承性的局限性。
2:实现的方式更适合用来处理多个线程有共享数据的情况。
联系:
Thread也是实现自Runable,两种方式都需要重写run()方法,将线程要执行的逻辑声明在run中 。

特别声明:文章为百度等搜索各类资料所得,仅用于个人学习记录,勿赏侵删。

Java新手入门——什么是多线程相关推荐

  1. java新手入门学习指南

    java新手入门学习指南由 android杂谈网原创. 0.准备 1.JDK安装和环境变量配置 2. 安卓开发环境搭建 3.熟悉eclipse开发环境,并使用eclipse创建第一个java应用程序 ...

  2. Java新手入门200例124之用JDBC连接Mysql数据库

    文章目录 作者简介 引言 导航 热门专栏推荐 一.创建web项目 二.加入Mysql驱动 三.编写查询代码 四.测试查询代码 五.编写插入代码 六.编写修改代码 七.编写删除代码 小结 导航 热门专栏 ...

  3. Java新手入门的30个基本概念

    Java概述: 目前Java主要应用于中间件的开发(middleware)---处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网 ...

  4. 适合Java新手入门的控制台程序练习题

    这里面整理的都是我当初从小白入门时练习过的编码题,特此来整理一下,大家可以通过下面的编码题来逐渐提升自己的编码逻辑力集业务逻辑思考力.这里边的代码答案都是我自己编写的,有任何问题欢迎大家反馈指教哈.共 ...

  5. java 新手入门电子书_java基础知识(适合新手入门).pdf

    Java 基础知识 本文中主要分为三个部分,第一个部分介绍java 的基本概念,第二部分介绍了java 的 基础知识,第三部分讲解了java 的语法以及实现代码,适合java 初学者学习. 一 Jav ...

  6. Java新手入门200例122之通过Java反射操作成员变量,set 和 get

    文章目录 作者简介 引言 导航 热门专栏推荐 创建Person类 编写操作类 小结 导航 热门专栏推荐 作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.Java ...

  7. java 新手入门电子书_Java基础入门指导(适合所有初学者).pdf

    来源:小天使笔记本防盗软件官网 () 第 章 Java 语言概述与面向对象思想 . Java 语言的发展 . . Java 语言的产生 . .2 Java 语言的发展 .2 Java 语言的特点 2 ...

  8. Java新手入门200例119之Java反射机制得到类的包名和类名

    文章目录 作者简介 引言 导航 热门专栏推荐 创建一个类Person 方案1 方案2 方案3 小结 导航 热门专栏推荐 作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通J ...

  9. java新手入门指南

    Java的优势 1.安全稳定 2.语法较为简洁 3.未来发展空间大 4.跨平台优势 Java程序结构 1.类的结构 public class 文件名{} 类文件名均为英文字母,规范的写法是类名首字母大 ...

最新文章

  1. 智能驾驶L2的黄金时代,打磨地图是关键
  2. Win XP等多个版本操作系统技术支持将到期
  3. UVa 10047,独轮车
  4. Redis的安装及使用
  5. spring源码分析之spring-jdbc模块详解
  6. 创业——不可忽视的创业计划书!!!
  7. Design Compiler指南——设计综合过程
  8. python 爬虫热搜_Python网络爬虫之爬取微博热搜
  9. Java Character.UnicodeBlock of()方法与示例
  10. JMS学习二(简单的ActiveMQ实例)
  11. 小程序:版本更新后获取用户信息变更
  12. android控件详解大全 android开发有关资料
  13. 走出校门,重新起航,从纯粹到再次纯粹
  14. 页面加载性能之如何测试打开速度
  15. RFID读写器web插件实现读卡写卡
  16. 使用Python获取股票实时数据和历史数据
  17. Python——列表的方法
  18. Vue全网最细入门(一)
  19. c语言实现哥德巴赫猜想(函数版)
  20. png的计算机储存图片的格式吗,我电脑打不开png格式的图片,如何解决?

热门文章

  1. 80-Python_输入华氏温度转换成摄氏温度
  2. 小陈学JS 遍历数组
  3. python正则表达式(一)
  4. 如何用Python+统计学,进行数据分析
  5. vue 计算属性和方法
  6. 扑克牌中的顺子。从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
  7. Cunti 使用简介
  8. 智能音箱背后的自然语言理解和知识图谱技术
  9. java期末知识点总结_java期末复习
  10. windows10下QT6.4.3编译qsqlmysql Debug+Release动态库