程序Program 是完成特定人,用某种语言编写的一组指令集合,即一段静态代码,静态对象

进程Process 是程序的一次执行过程,可以是一个正在执行的程序

- 程序是静态的,进程是动态的

- 进程是分配资源的单位,系统运行时为每个进程分配不同的内存区域

- 线程 Thread 进程可进一步细化为线程,一个程序内部的一条执行路径

一个进程在同一时间并行执行多个线程,就是多线程的

线程作为调度和执行的单位,每个线程用友独立的运行栈和程序计数器

- 一个进程的多个线程共享内存单元/内存空间地址,从同一堆中分配对象,可以访问相同变量和对象

- 可能造成数据安全隐患

并行和并发

- 并行 多个人同时做不同的事

- 并发 多个人同时处理一件事

Java的应用程序 java.exe 至少三个线程存在 Main GC 异常

为什么需要多线程?

- 提高计算性能 增强用户体验、

- 提供CPU的使用效率

- 改善程序结构,把进程拆分多个线程独立运行

使用场景:

- 程序执行超过1个以上的任务

- 实现一些等待任务 用户输入,文件读写、网络操作

- 后台程序

创建多线程

第一种

- 创建一个类去继承Thread类

- 重写Thread类的run方法 此线程的操作声明在run中

- 创建Thread类的子类实例

- 调用start方法开启线程

方式一

public class ThreadTest {
public static void main(String[] args) {
// 创建实例
Thread thread = new MyThread();
// 开启线程 调用当前线程的run方法运行 不能直接调用run的方式启动线程
thread.start();
      System.out.println("Main");
}
} // 编写一个类继承Thread线程类
class MyThread extends Thread{ // 重写Run方法
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
String check = i % 2 == 0 ? "yes "+i : "no "+i;
System.out.println(check);
}
}
}

方式二使用匿名内部类

public class ThreadTest {
public static void main(String[] args) {
// 使用匿名内部类
Thread thread = new Thread(){
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
String check = i % 2 == 0 ? "yes "+i : "no "+i;
System.out.println(check);
}
}
};
thread.start();
}
}

方式三匿名直接使用

public class ThreadTest {
public static void main(String[] args) {
// 使用匿名对象 + 匿名内部类 直接调用
new Thread(){
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
String check = i % 2 == 0 ? "yes "+i : "no "+i;
System.out.println(check);
}
}
}.start();
}
}
//常用方法
// start(); 开启线程
// run(); 运行线程,执行run方法体内的代码块
// currentThread(); 静态方法,返回指向当前代码的线程
// getName();获取当前线程名字
// setName();设置当前线程名字 开启线程之前使用
// yield(); 释放CPU执行权
// join(); 线程a中调用线程b的join 线程a进入阻塞状态,直至线程b执行完在执行线程a
// stop(); 强行结束当前线程 已过时
// sleep(long millitime); 当前线程睡眠,超时参数时间执行线程,指定的参数时间内,线程是阻塞状态
// isAlive(); 判断线程是否存活

线程优先级设置 
MAX_PRIORITY 10 最大优先级 10
MIN_PRIORITY 1 最小优先级 1
NORM_PRIORITY 5 通常优先级 5

获取和设置当前线程的优先级
getPriority(); 获取线程优先级
setPriority(int p); 设置线程优先级

高优先级只是表示线程抢占到CPU执行的概率要高于低优先级,并不是一定优先

第二种实现Runnable接口
- 创建实现类
- 重写run方法
- 创建实例
- 实例作为参数注入线程实例中
- 线程实例调用start方法开启
public class ThreadTest {
public static void main(String[] args) { new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}).start();
}
}

线程的生命周期

新建 - 就绪 - 运行 - 阻塞 - 释放

同步代码块

synchronized(同步监视器对象) { 需要被同步的代码}

1 操作共享数据的代码 即需要被同步的代码

2 共享数据,多线程共同操作的变量

3 同步监视器,俗称锁 任何一个类的对象都可以充当锁

实现同步的要求是,所有的线程都公用一把锁

- 解决线程安全,性能降低了



【Java】MuliThread 多线程的更多相关文章

  1. Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  2. java之多线程 二

    线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...

  3. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  4. Java Thread 多线程 介绍

    1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...

  5. Java:多线程<一>

    程序运行时,其实是CPU在执行程序的进程,为了提高工作效率一个进程可以有多个线程. Java的多线程: 其实我们之前就见过Java的线程,main就是Java的一个线程,还有另一个条线程总是和main ...

  6. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  7. Java的多线程机制系列:(三)synchronized的同步原理

    synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...

  8. Java基础——多线程

    Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢? http://www.jianshu.com/p/40d4c7aebd66 一.常用的有三种方法来创建多线程 新建一个类继承自 ...

  9. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  10. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

随机推荐

  1. vue3 elementui plus Select 选择器不选择下拉框里面的数据得到的value值

    我们先来看 我点击弹框出现什么都不做 直接点击确定 看传参 tableId,timeColumnId,userColumnId直接是名称而没有获取value值 看下下拉框里面的数据 而我想直接点击获取 ...

  2. 带你了解磁盘驱动程序(xv6)

    磁盘驱动程序 本文来聊聊磁盘驱动程序,驱动程序是硬件的接口,操作系统通过这个接口来控制硬件工作,所以驱动程序就好比是硬件和系统之间的桥梁.这是百科上给出的解释,可能看起来还是云里雾里,我来做做注解. ...

  3. 从pfx私钥证书中提取私钥

    要准备openssl win 32 del /Q c:\mch_private2.pem c:\OpenSSL-Win32\bin\openssl.exe pkcs12 -in c:\mch_priv ...

  4. 前端使用 Konva 实现可视化设计器(14)- 折线 - 最优路径应用【代码篇】

    话接上回<前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用[思路篇]>,这一章继续说说相关的代码如何构思的,如何一步步构建数据模型可供 AStar 算法进行路径规划 ...

  5. Spring Boot 使用 拦截器 实现 token 验证

    Spring Boot 使用 拦截器 实现 token 验证 整体思路:1.写一个工具类封装生成.校验和解析 token 的方法:2.在注册和登录时生成 token ,生成的 token 存入 red ...

  6. 修改Oracle数据表空间存储位置

    查看数据文件的存储路径: SQL> select name from v$datafile; NAME --------------------------------------------- ...

  7. 3568F-Docker容器部署方法说明

                 

  8. ARM+DSP异构多核——全志T113-i+玄铁HiFi4核心板规格书

    核心板简介 创龙科技SOM-TLT113是一款基于全志科技T113-i双核ARM Cortex-A7 + 玄铁C906 RISC-V + HiFi4 DSP异构多核处理器设计的全国产工业核心板,ARM ...

  9. TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

    1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性 ...

  10. hive案例:hive对房产数据进行过滤

    数据: 天通苑北一区 3室2厅 510万 1.01101E+11 天通苑北一区 3-2厅 143.09 平米 南北 简装 有电梯 35642 510旗胜家园 2室1厅 385万 1.01101E+11 ...