day12

bigDecimal,用于计算钱的数据类型

多线程

线程与进程

进程

1)执行中的应用程序

2)一个进程可以包含一个或者多个线程

3)一个进程至少要包含一个线程(如main方法)

线程

线程本身是依靠进程(程序)进行

线程是程序中的顺序控制流,只能使用分配给程序(进程)的资源和环境

线程是进程中可以独立执行的最小执行单元

单线程

程序中只存在一个主线程,实际上main就是一个主线程

线程 :进程中所要完成的一个计算过程,也被称为进程的任务

多线程

更好的使用CPU资源,提高程序的计算效率

串行、并发与并行

串行:一个人,顺序地做多个任务

并行:多个人干一件事情,总耗时取决于时长最长的任务

并发:一个人,交替地做多个任务

实现并发

创建一个线程类的四种方法

public class Th1 {
public static void main(String[] args){
//继承Thread创建线程的方法可以直接创建其对象后用对象调用start()方法
Workers1 w1 = new Workers1();
w1.setName("t1");//给线程命名
w1.start(); /**实现Runnable,重写run方法创建线程时,只能先创建线程对象再引用start()方法
Workers2 w2 = new Workers2();
Thread t = new Thread(w2);//Thread(Runnable Target)方法
//Thread t = new Thread(w2,"th2");//用Thread(Runnable Target, String name)方法命名
t.start();
*/
}
}

1)继承Thread类:extends Thread

class Workers1 extends Thread{
public void run(){
String name = Thread.currentThread().getName();//Thread(类).currentThread()(获取当前线程对象).getName()(当前线程的名字)
System.out.println(name);
System.out.println("线程类开始执行");
}
}

2)实现Rannable接口:implements Runnable

class Workers2 implements Runnable{

    public void run(){
String name = Thread.currentThread().getName();
System.out.println(name);
System.out.println("重写runnable接口");
}
}

3)通过Callable接口和FutureTask对象创建线程

4)通过线程池创建对象

线程生命周期(五种状态)

1)新建状态;线程对象创建之后,即进入新建状态;

2)就绪状态:调用线程对象的start()方法,线程进入就绪状态。表示线程做好准备随时等待CPU调度执行,并不是执行start()该线程就会立即执行;

3)运行状态:cpu开始调度处于就绪状态的线程时,此时线程才开始执行(执行run()方法),即进入运行状态。注意:就绪状态是进入到运行状态的唯一入口,也就是说,线程想进入运行状态执行,就必须处于就绪状态中;

4)阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对cpu的使用权,停止执行,此时进入阻塞状态。直到其重新进入到就绪状态,才有机会再次呗cpu调用以进入到运行状态

5)死亡状态:线程执行完毕或者因异常退出了run()方法,该线程结束生命周期,线程销毁。(销毁之前还要垃圾回收,结束周期之后不是立即销毁)

阻塞状态

(根据阻塞产生的原因不同)

1.等待阻塞:运行状态中的线程执行Object.wait()方法

2.同步阻塞:线程在获取synchronized内部锁失败(因为锁被其他线程所占用)

3.其他阻塞:通过调用线程的Thread.sleep()、join()方法或者发出I/O请求时,线程会进入到阻塞状态。当sleep()状态超时(sleep休眠结束)、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态

sleep wait方法

sleep()让程序等待一段时间再运行,单位是毫秒

for(int i = 0; i < 9; i++){
try{
sleep(1000);//线程休眠,单位是毫秒
}catch(InterruptedException e){
e.printStackTrace();
} System.out.println(i);
}

wait()线程等待,单位是毫秒

for(int i = 0; i < 9; i++){
try{
wait(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(i);
}//非法监视器

wait()和sleep()区别

1)sleep()方法属于Thread类,wait()方法属于Object类

2)sleep()方法表示线程休眠指定的时间,休眠时间结束,线程继续执行,wait()方法表示线程等待,此时的线程会让出CPU资源,直到其他线程通过notify()/notifyAll()方法唤醒该线程

同步机制

多个线程按照一定顺序执行的解决方案

内部锁(Intrinsic Lock)/监听器(Monitor)

同步锁:synchronized关键字

内部锁是一种排他锁,能够保障原子性、可见性和有序性

synchronized可以用来修饰方法以及代码块,它修饰的方法统称为同步方法,修饰静态方法称为同步静态方法,修饰代码块被称为同步代码块

核心:多个线程争用一把锁,谁拿到锁才能调用锁关键字声明的方法

/**
//类锁
synchronized(类名.class){
}
*/
public class Th1{
static int count;
static void add(){
synchronized(Th1.class){
for(int i = 0; i < 50000; i++){
count++;
System.out.println(count);
}
} }
}
/**
//方法锁 synchronized(this){ }
*/
public class SynDemo04 {
int money;
public static void main(String[] args) {
SynDemo04 synD14 = new SynDemo04();
Demo worker = new Demo(synD14,"t1");
Demo worker2 = new Demo(synD14, "t2");
worker.start();
worker2.start();
} public void add(){
//对象锁
synchronized (this) {
for (int i = 0; i < 50000; i++) {
money++;
System.out.println(money);
}
} } } class Demo extends Thread{
private SynDemo04 synD;
public Demo(SynDemo04 synD,String name){
this.synD = synD;
this.setName(name);
}
public void run() {
synD.add();
}
}

显式锁:Lock接口

day12 多线程1.进程与线程 & 2.线程生命周期 & 3.线程同步机制的更多相关文章

  1. java多线程(2)---生命周期、线程通讯

    java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别.    1.yield()方法 yield()让当前正在运行的线程回到就绪 ...

  2. Java多线程与并发——线程生命周期和线程池

    线程生命周期:  线程池:是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行复用.减少频繁的创建和销毁对象. java里面线程池的顶级接口是E ...

  3. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  4. Servlet生命周期与线程安全

    上一篇介绍了Servlet初始化,以及如何处理HTTP请求,实际上在这两个过程中,都伴随着Servlet的生命周期,都是Servlet生命周期的一部分.同时,由于Tomcat容器默认是采用单实例多线程 ...

  5. java 多线程总结篇3之——生命周期和线程同步

    一.生命周期 线程的生命周期全在一张图中,理解此图是基本: 线程状态图 一.新建和就绪状态 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Jav ...

  6. java多线程(二)-线程的生命周期及线程间通信

    一.摘要    当我们将线程创建并start时候,它不会一直占据着cpu执行,而是多个线程间会去执行着这个cpu,此时这些线程就会在多个状态之间进行着切换. 在线程的生命周期中,它会有5种状态,分别为 ...

  7. Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究

    线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分 ...

  8. asp.net静态变量的生命周期和线程安全

    void Application_Start开始 void Application_End结束的,本来这就是对的 今天要做一个全局的应用,想确认一下,在网上一找,我的天,说什么的都有 大概分三种 1. ...

  9. Java学习笔记之——线程的生命周期、线程同步

    一. 线程的生命周期 新建(new Thrad):创建线程后,可以设置各个属性值,即启动前 设置 就绪(Runnable):已经启动,等待CPU调动 运行(Running):正在被CPU调度 阻塞(B ...

  10. Servlet的生命周期以及线程安全问题

    一:Servlet生命周期图,以及注意事项 二:代码演示 LifeCycleServlet.java package cn.woo.servlet; import java.io.IOExceptio ...

随机推荐

  1. 继GitHub的Copilot收费后,亚马逊推出了 CodeWhisperer,感觉不错哟!

    Copilot 是 Github 推出的一款人工智能编程助手,推出仅一年就受到大量开发者的追捧(据官方统计有 120 万用户).然而,自 2022 年 6 月起,它改为了付费订阅模式(每月 10 美元 ...

  2. 【WPF】实现动态切换语言(国际化)以及动态换肤功能

    前言:以下内容,手把手从搭建到最终实现,完成多语言切换以及换装功能. 本地系统环境:win 10 编译器环境:VS2022 社区版 .NET 环境: .NET 6 1.新建一个WPF项目 2.新建完毕 ...

  3. Python数据科学手册-Pandas:数值运算方法

    Numpy 的基本能力之一是快速对每个元素进行运算 Pandas 继承了Numpy的功能,也实现了一些高效技巧. 对于1元运算,(函数,三角函数)保留索引和列标签 对于2元运算,(加法,乘法),Pan ...

  4. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  5. Python实验报告——第3章 流程控制语句

    实验报告 [实验目的] 1.掌握python中流程控制语句的使用,并能够应用到实际开发中. [实验条件] 1.PC机或者远程编程环境 [实验内容] 1.完成第三章流程控制语句实例01-09,实战一到实 ...

  6. DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用.本文属于入门级博客,期望本文能让大家了解 Vortic ...

  7. nsis插件nsisSlideshow.dll更新

    更新至1.7版本,作者wiz0u已解决关于ie9的兼容问题.Good 下载地址: http://wiz0u.free.fr/prog/nsisSlideshow/latest.php

  8. pycharm下载与使用

    pycharm下载与使用 PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开 ...

  9. 聊聊Linux中CPU上下文切换

    目录 什么是CPU上下文 CPU上下文切换 上一任务的CPU上下文保存在哪? 进程上下文切换 内核空间和用户空间 top命令查看CPU资源 系统调用 进程上下文切换 和 系统调用的区别? 进程切换的常 ...

  10. 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)

    本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...