多线程学习(第一天)java语言的线程
2024-10-12 10:43:51
一、并发与并行
并发:处理器不停的切换有操作的线程。
并行:多个处理器同时执行有操作线程。
二、启动线程
无论是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唤醒该线程。
最新文章
- jquery的.html(),.text()和.val()方法
- Grpc微服务从零入门
- Code笔记 之:防盗链(图片)
- Leetcode 202 Happy Number 弗洛伊德判环解循环
- Java synchronized关键字用法(清晰易懂)
- struts2.3.16所需的基本的jar包
- SQL PROMPT 取消dbo前缀
- Linux chmod命令修改文件与文件夹权限的命令附实例
- JMeterPluginCMD命令行工具使用详解
- HDU5781--ATM Mechine(概率dp)
- Etcd学习(一)安装和.NETclient測试
- SQL中将某个表中的多行数据在一个字段显示
- “出错了”和报告Bug的艺术
- php高精度计算问题
- TCP/IP协议示意图
- Abp + gRpc 如何实现用户会话状态传递
- js模板引擎-art-template常用总结(转)
- BZOJ 2173 luoguo P4451 [国家集训队]整数的lqp拆分
- 微网站|h5弹窗|手机网站 html5 弹窗、弹层、提示框、加载条
- React Native移动开发实战-3-实现页面间的数据传递
热门文章
- 跨平台C++ DLL导出宏
- vue3 使用watch 监听多个数据
- 42.Linux查看日志的几种方式
- 计算机存储内部数据的原理,编程语言的发展史和分类,python解释器的下载和安装,计算机cmd窗口的使用,环境变量和解释器多版本共存方法
- mysql 根据父id查询下级所有数据
- VMware-安装rpm包出现警告:tigervnc-1.1.0-24.el6.x86_64.
- shell实现接口初次失败告警,恢复也发送一次通知
- C语言中关于宏定义的学习
- Server2008通过bat命令自动定时备份MySQL数据库
- CS客户端 App.Config更新问题