多线程学习(第一天)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 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...
随机推荐
- springmvc关于通过使用路径占位符出现中文乱码解决办法
springmvc接受json数据使用@GetMapping通过名称.通过对象,也可以通过路径.当使用路径占位符时,会出现中文乱码.此时,需要转换.即 @GetMapping("/girl5 ...
- 在windows服务中托管asp.net.core
参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1& ...
- 肖sir_多线程Thread(threading)__知识点
多线程Thread(threading) 一.理论知识 二.实战
- WDA学习(28):Drag &Drop使用
1.21 Drag Drop使用 本实例测试Drag Drop; 运行结果: Drag图标Drop到添加Icon,会将一条记录添加到Table; Drag Table记录Drop到垃圾桶Icon,会将 ...
- cython并行性能-计算滚动求和 rolling function
cython通过编译为C程序提高性能有很多例子,通过OpenMP并行的性能没那么多. 今天尝试了一下似乎gcc对parallelism reduction优化的很厉害,加上OpenMP并行可以提高20 ...
- Python的入门复习一 Day 8——from“夜曲编程”
Day 8 time: 2021.8.5. 原来P课程已经安排好了专题复习呢.所以,今天的重心就落在了角落知识点于相关课程实践上了.这次总结,也是一如既往地兵分两路呢. 注意事项: 格式化时,在前,引 ...
- spring@Validated校验用法
1.controller添加注解 public BaseResponse addOrUpdateUnit(@RequestBody @Validated RiskUnitDto riskUnitDto ...
- 可收集ALC问题[Microsoft.Data.SqlClient is not supported on this platform.]
异常 Microsoft.Data.SqlClient is not supported on this platform. 堆栈跟踪 at Microsoft.Data.SqlClient.SqlC ...
- 调度器30—调度相关结构体—p->flags
一.PF_EXITING 1. 赋值路径 各驱动和内核机制中直接调用 SYSCALL_DEFINE1(exit, int, error_code) //exit.c do_exit(code); // ...
- Symfony2在Nginx下的配置方法图文教程
来源: https://www.xp.cn/b.php/79706.html Symfony2在Nginx下的配置方法图文教程 本文详细讲述了Symfony2在Nginx下的配置方法.分享给大家供大家 ...