标签:同步代码块 ext account star 有一个 监视器 竞争 div text
说起线程 就不得不提进程 他们之间的关系很紧密
进程:内存中运行的应用程序 每个进程都有自己的一块内存空间 而线程是进程中的一个执行单元 一个进程中可以有多个线程 多线程的好处就是可以并发操作程序 将cpu资源利用率最大化 就像我们生活中一样 当我们在一个视屏网站下电影的时候 我们可以去做一些其他的时间 不需要一直等着电影下完再去做不会耗费多余的时间 这就是多线程的好处
如何实现多线程呢
1.继承Thread类 然后重写run方法
2.实现Runnable接口实现重写·
|
特点
|
继承thread类
|
只适用于单继承 编写简单 可以直接操作
|
实现runnable接口
|
可以实现多继承
|
线程的状态
1.新建状态
线程在被创建后就进入了新建状态 例如Thread thread=newThread();
2.就绪状态(也称为可执行转态)
1 package com.newroad.thread.test;
2 //账户类
3 public class Account {
4 private double balance;
5 private Object lock=new Object();
6 public Account(double balance) {
7 super();
8 this.balance = balance;
9 }
10 public void withdrawMoney(double money) {
11 String name=Thread.currentThread().getName();
12 System.out.println(name+"取款前账户余额为:"+balance);
13 if (balance>=money) {
14 balance=balance-money;
15 System.out.println(name+"取款金额为:"+money +"取款后,余额为:"+balance);
16 }else {
17 System.out.println(name+"余额不足,账户余额为:"+balance+"取款金额为;"+money);
18 }
19
20 }
21
3
34
35 }
36
37 //线程类
38 package com.newroad.thread.test;
40 public class PersonThread extends Thread {
41 private Account account;
42 private double drawbalance;
43 public PersonThread(Account account, double drawbalance) {
44 super();
45 this.account = account;
46 this.drawbalance = drawbalance;
47 }
48
49 @Override
50 public void run() {
51 account.withdrawMoney(drawbalance);
52
53 }
54
55 }
56
57
58 //这是测试类
59 package com.newroad.thread.test;
60
61 public class Test {
62 public static void main(String[] args) {
63 Account account=new Account(4000);
64 PersonThread p=new PersonThread(account, 2400);
65 PersonThread p1=new PersonThread(account, 1000);
66 PersonThread p2=new PersonThread(account, 600);
67 p.setName("张三");
68 p1.setName("张三媳妇");
69 p2.setName("张三爸");
70 p.start();
71 p1.start();
72 p2.start();
73 }
74 }
1 package com.newroad.thread.test;
2
3 public class Account {
4 private double balance;
5 private Object lock = new Object();
6
7 public Account(double balance) {
8 super();
9 this.balance = balance;
10 }
11 public void withdrawMoney(double money) {
12 String name = Thread.currentThread().getName();
13 synchronized (this) {
14 System.out.println(name + "取款前账户余额为:" + balance);
15 if (this.balance >= money) {
16 balance = balance - money;
17 System.out.println(name + "取款金额为:" + money + "取款后,余额为:" + balance);
18 } else {
19 System.out.println(name + "余额不足,账户余额为:" + balance + "取款金额为;" + money);
20 }
21 }
22 }
23
24 }
这时我们就可以发现就没问题了
标签:同步代码块 ext account star 有一个 监视器 竞争 div text
原文地址:https://www.cnblogs.com/hengly/p/10664392.html