多线程学习(第一天)java语言的线程
一、并发与并行
并发:处理器不停的切换有操作的线程。
并行:多个处理器同时执行有操作线程。
二、启动线程
无论是A,B哪种方式实现多线程,都需要通过Thread.start方法启动线程。
A、Thread
自定义类继承Thread
public class MyThread extends Thread { private String name; public MyThread(String name) {
this.name = name;
} public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
public static void main(String[] args) {
Thread t = new MyThread("A");
t.start(); Thread t1 = new MyThread("B");
t1.start();
}
B、Runnable
自定义类实现Runnable接口
public class MyThread implements Runnable{ private String name; public MyThread(String name) {
this.name = name;
} @Override
public void run(){
for (int i = 0; i < 1000; i++) {
System.out.print("我是Thread子线程"+this.name+" ");
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyThread("A"));
t1.start(); Thread t2 = new Thread(new MyThread("B"));
t2.start();
}
三、多线程取钱问题
存在多次取钱,账号余额不减的情况
/**
* ATM对象
*/
public class AtmThread extends Thread { Account account; long amount; public AtmThread(Account account, long amount) {
this.account = account;
this.amount = amount;
} public void run() {
System.out.println();
System.out.println(this.getName()+"开始取钱("+this.amount+")->");
System.out.println(this.getName()+"查询余额("+this.account.balance+")->");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (this.account.balance < this.amount) {
System.out.println("余额不足");
return;
}
this.account.setBalance(this.account.balance-this.amount);
System.out.println(this.getName()+"结束取钱,余额:"+this.account.balance);
}
}
/**
* 账户
*/
public class Account {
/**
* 余额
*/
long balance; public Account(long balance) {
this.balance = balance;
} public long getBalance() {
return balance;
} public void setBalance(long balance) {
this.balance = balance;
}
}
public static void main(String[] args) {
Account account = new Account(1000);
/**
* 取5次钱
*/
for (int i = 0; i < 5; i++) {
new AtmThread(account, 600).start();
}
}
Thread-0开始取钱(600)->
Thread-3开始取钱(600)->
Thread-3查询余额(1000)->
Thread-0查询余额(1000)->
Thread-4开始取钱(600)->
Thread-4查询余额(1000)->
Thread-1开始取钱(600)->
Thread-1查询余额(1000)->
Thread-2开始取钱(600)->
Thread-2查询余额(1000)->
Thread-3结束取钱,余额:400
余额不足
Thread-0结束取钱,余额:400
Thread-1结束取钱,余额:400
余额不足
解决上面问题,使用synchronized关键字。代码修改如下:将账号对象加锁处理。
运行结果:
Thread-0开始取钱(600)->
Thread-0查询余额(1000)->
Thread-0等待中。。。。。。
Thread-0结束取钱,余额:400 Thread-4开始取钱(600)->
Thread-4查询余额(400)->
Thread-4等待中。。。。。。
Thread-4余额不足 Thread-3开始取钱(600)->
Thread-3查询余额(400)->
Thread-3等待中。。。。。。
Thread-3余额不足 Thread-2开始取钱(600)->
Thread-2查询余额(400)->
Thread-2等待中。。。。。。
Thread-2余额不足 Thread-1开始取钱(600)->
Thread-1查询余额(400)->
Thread-1等待中。。。。。。
Thread-1余额不足
四、wait set线程休息室
线程执行wait方法后,都会进入到wait set中,直到有notify,notifyAll,interrupt唤醒该线程。
多线程学习(第一天)java语言的线程的更多相关文章
- javaSE习题 第一章 JAVA语言概述
转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...
- JAVA语言规范-线程和锁章节之同步、等待和通知
JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...
- 第一章 Java语言概述
1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- java 学习笔记1 java语言概述及开发环境
高级语言运行机制 高级语言按程序的执行方式分为编译型和解释型两种. java语言比较特殊,Java程序的执行必须经过先编译后解释的步骤. 1 编译生成字节码,只面向JVM(.class) 2Jvm执行 ...
- 第一天 Java语言概述
一.什么是软件 软件就是按照特定的顺序把数据和指令组合在一起,能够完成相应功能的程序. 软件分为两种: 系统软件:专门用户运行其他程序的平台.比如Linux.Windows.MAC等 应用软件:完成相 ...
- 第一章 Java语言概述1
1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...
- 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制
内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...
- java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)
最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...
- 第一章 Java语言概述2
一.编写第一个Java应用程序 1.下载.安装JDK 官方网址:www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...
随机推荐
- offer_48
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路: /* 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计 ...
- Kubernetes v1.22 编译 kubeadm 修改证书有效期到 100 年
此方法支持以下 kubeadm版本 v1.22到v1.25 kubeadm 默认证书为一年,一年过期后,会导致 api service 不可用,使用过程中会出现:x509: certificate h ...
- stm32 出入栈
Start.S 一般指定栈顶指针及栈大小 1.硬件中断 有硬件入栈和软件入栈部分 硬件入栈寄存器: R0,R1,R2,R3,R12,PSR 软件入栈寄存器: r4 - r11 2.程序切换入栈 ...
- Vuex 部分
Vuex 部分 官网链接 https://vuex.vuejs.org/zh/ 先说一下vuex到底是什么? vuex 是一个专门为vue.js应用程序开发的状态管理模式. 这个状态我们可以理解为在d ...
- Windows11使用WSL Ubuntu搭建paddle的GPU环境
Windows11使用WSL Ubuntu搭建paddle的GPU环境 最近升级到了Windows11,突然有个大胆的想法:在Windows11上安装WSL,将所有开发环境安装到WSL中.这样就能在w ...
- Mac技术服务, 感谢 点赞打赏
首先,非常感谢大家对我的支持和鼓励. 如果需要单独解决Mac问题,您也可以选择付费服务,感谢大家的理解与支持! * 普通问题/软件安装:10元--100元每个(根据具体问题由您而定): * 普通问 ...
- 分析网络工具 Wireshark与tcpdump
一.安装使用 1. 安装 2. 选择网卡:我们的主机就是通过其中一块网卡和其他主机进行数据交互: 3. 点击开始:打开wireshark,点击左上角那个蓝色的鲨鱼鳍按钮,开始捕获新的分组并清空之前的分 ...
- Pytest初识
一.单元测试框架简介 1. 什么是单元测试 单元测试是指在软件开发过程中,针对软件的最小单位(函数,方法)进行正确性的检查测试. 2. 常用单元测试框架 2.1 Java 类别 junit testn ...
- C# 三层架构 简单清晰讲解
https://www.cnblogs.com/smbk/p/5339610.html
- docker部署flask+uwsgi+nginx+postgresql,解耦拆分到多个容器,实现多容器互访
本人承诺,本博客内容,亲测有效. dockerfile文件, FROM centos:7 RUN mkdir /opt/flask_app COPY ./show_data_from_jira /op ...