一、 什么是多线程:

我们现在所使用操作系统都是多任务操作系统(早期使用的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. 基于长短读长和参考基因组的组装错误检测算法的研究
  2. “无路之门”,一款VR恐怖冒险游戏
  3. child_process 子进程
  4. c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别(转)
  5. hbase 页面访问_HBase在滴滴出行的应用场景和最佳实践
  6. 【给你几个使用Xamarin的理由】
  7. nyoj--49--开心的小明(背包)
  8. C语言实训设计——疫情健康打卡系统
  9. QCC512x/302x笔记(3)-- 只改一行代码,实现串口输出调试log
  10. 计算机硬盘如何制作成移动硬盘,电脑拆出来的闲置硬盘别扔 这么做帮你把它变成移动硬盘...
  11. 唯库拼课课程大合集更新111门
  12. 程序员月薪5W却发出哀叹:家庭枷锁太重,生活如同围城
  13. Cain 不能显示外接网卡问题解决
  14. python中sha1 md5等用法
  15. IE、MIcrosoft Edge无法上网,但其他浏览器可以上网 —— 解决方案
  16. 《金刚经》大致说什么
  17. 【算法合集】深搜广搜Prim与Kruskal
  18. type和interface的区别
  19. AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解| AI TIME
  20. Java类加载器详解 1

热门文章

  1. 框架模式MVC与MVP在Android中的应用
  2. vue双向数据绑定原理学习
  3. Deep Reinforcement Learning for Task Offloading in Mobile Edge Computing Systems
  4. 2023年考研计算机统考408计算机学科专业基础综合历年真题视频
  5. 微软ghost系统分类合集
  6. 请原谅,我还来不及长大
  7. python,selenium爬取微博热搜存入Mysql
  8. 合天网安weekly系列ctf实战 | 第八周 | 随意的上传wp
  9. 计算机网络资料整理《谢希仁版》
  10. 面试笔记 如何3秒钟看出一个人的实力?| 奸商行走江湖7年的经验分享