java之 ------ 多线程(交互线程)
来源:互联网 发布:telnet ip 端口 linux 编辑:程序博客网 时间:2024/05/29 19:29
1、运行结果不惟一,取决于线程调度
2、线程执行被打断时出现错误
3、线程互斥和临界区管理
1)操作系统对共享一个变量的若干线程进入各自临界区有以下3个调度原则:
2)一次至多一个线程能够在它的临界区内。
3)不能让一个线程无限地留在它的临界区内。
4)不能强迫一个线程无限地等待进入它的临界区。特别地,进入临界区的任一线程不能妨碍正等待进入的其他线程的进展。
4、同步语句 synchronized (对象)
同步方法 synchronized 方法声明 方法声明synchronized(this){ 方法体 }
5、银行账户的存款取款线程
Account.c
package p25;public class Account {private String name;//储户姓名private double balance;//账户余额public Account(String name) {this.name = name;this.balance = 0;}//查询余额public double balance() {return this.balance;}public String getName() {return this.name;}//存款操作public void put(double value) {if (value > 0) {this.balance += value;}}//取款操作public double get(double value) {if (value > 0) {if (value < this.balance) {//够取this.balance -= value;} else {value = this.balance;this.balance = 0;}return value;}return 0;}}class Save extends Thread {private Account account;private double value;public Save(Account account, double value) {this.account = account;this.value = value;}public void run() {synchronized (account) {//声明临界区,锁定当前account对象double howmuch = this.account.balance();//查看账户余额try {sleep(1);} catch (InterruptedException e) {e.printStackTrace();}this.account.put(this.value);double howmuch2 = this.account.balance();//查看账户余额System.out.println(this.account.getName() + "账户: 现有" + howmuch+ ",存入" + this.value + ",余额为" + howmuch2);}}}class Fetch extends Thread {private Account account;private double value;public Fetch(Account account, double value) {this.account = account;this.value = value;}public void run() {synchronized (account) {double howmuch = this.account.balance();try {sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}double v = this.account.get(this.value);double howmuch2 = this.account.balance();System.out.println(this.account.getName() + "账户: 现有" + howmuch+ ",取出" + v + ",余额为" + howmuch2);}}}class Func extends Thread {private Account account;private double value;public Func(Account account, double value) {this.account = account;this.value = value;}public void run() {fun();}synchronized void fun(){double howmuch = this.account.balance();try {sleep(1);} catch (InterruptedException e) {e.printStackTrace();}this.account.put(this.value);double v = this.account.get(this.value);double howmuch2 = this.account.balance();System.out.println(this.account.getName() + "账户: 现有" + howmuch + ",取出"+ v + ",余额为" + howmuch2);}}Bank.c
package p25;public class Bank {public static void main(String[] args) {Account wang = new Account("wang");(new Save(wang,100)).start();(new Save(wang,200)).start();(new Fetch(wang,100)).start();Account li=new Account("li");(new Save(li,300)).start();Account xu=new Account("xu");(new Func(xu,100000)).start();}}
正确结果:
错误结果:
1 0
- java之 ------ 多线程(交互线程)
- Java多线程-线程的交互
- java多线程:线程的交互
- Java多线程-线程的交互
- Java多线程 -- 线程的交互
- Java之------多线程(从基础到加强及交互线程)
- 28、Java入门—多线程之线程交互
- 多线程之间交互线程之BlockingQueue
- Java多线程之线程池(一)
- Java多线程之线程池(二)
- Java多线程之线程池(三)
- Java多线程之线程池(四)
- Java多线程之线程锁(一)
- Java多线程之线程池(五)
- java多线程之守护线程(Daemon)
- Java多线程 之 后台线程(四)
- (13)Java多线程之线程组
- (14)Java多线程之线程状态
- 【读书笔记:C++ primer plus 第六版 中文版】第11章 使用类
- Android图像处理之Bitmap类
- Python学习笔记 - 生成器generator
- Java程序员必须掌握的8大排序算法
- 如何写菜单
- java之 ------ 多线程(交互线程)
- 关于INNER JOIN的效率问题
- Selector背景选择器
- sql server2005下载地址
- oracle exp/imp和sqlload
- 基础普及-Jar、War、Ear
- 带返回值的函数如果没有写全返回路径,这时的返回值系统由AX寄存器值确定
- u-boot-2014.10移植到s3c2416处理器添加文件分析
- 第17周周一