1 . 需求:男朋友往银行卡存钱,女朋友取同张银行卡的钱,用线程实现这个过程.
(其中,男存钱,女取钱是不同操作,但是银行卡的钱是共享资源.)这就属于有相同资源,不同操作的线程
2 . 男朋友为一个线程,女朋友为一个线程.
3 .首先,创建资源类Card
其次,实现男操作类,女操作类,都要继承Runnable.因为要实现资源共享.
其次,男女类重写run方法,实现各自的操作.
另外,男女要使用同一个Card对象,则男女类要有Card对象.
具体看代码吧还是:
package com.qf.demo2;
/**
* 线程:
*
* 共资源 一张银行卡
*
* 你 往里存钱, 存10次 每次存1000
* 你女朋友 取钱, 取10次 每次取1000
*
* 多线程实现存取过程
*
* 共享资源
* 操作相同
*
*
*
* 四个窗口 每个窗口 卖 100张票 没有共享资源 extends Thread
*
* 四个窗口 一共卖100张票 有共享资源 实现 Runnable
* 四个窗口操作相同 都是卖票
*
*
* 没有共享资源 不同操作 单独创建 不同的 操作类 继承 Thread
* 没有共享资源 相同操作 操作类 继承 Thread
* 有共享资源 相同操作 资源类实现Runnable
* 有共享资源 不同操作 单独创建资源类 让不同操作类实现 Ruannable
*
*
*/
public class Test {
public static void main(String[] args) {
Card card = new Card();
Boy boy = new Boy(card);
Girl girl = new Girl(card);
Thread thread = new Thread(boy);
Thread thread2 = new Thread(girl);
thread.start();
thread2.start();
}
}
class Card{
int money = 0;
}
class Boy implements Runnable{
Card card;
public Boy(Card card) {
this.card = card;
}
public void run() {
for (int i = 0; i <10; i++) {
card.money+=1000;
System.out.println("你呀, 存了1000块钱,卡里余额为"+card.money);
}
}
}
class Girl implements Runnable{
Card card;
public Girl(Card card) {
this.card = card;
}
public void run() {
for (int i = 0; i < 10; i++) {
card.money-=1000;
System.out.println("你女朋友啊, 取了1000跑了,卡里余额为"+card.money);
}
}
}
总结:在主方法中,
1 . 先是创建资源类对象
2 . 创建男女操作类对象,将资源类对象作为男女类对象的构造参数
3 .创建Thread对象,有几个操作对象就创建几个Thread对象,将操作类对象作为Thread对象的构造参数,
4 .此时Thread对象调用start()时,jvm会执行run()方法,虽然将操作类对象传给了Thread对象,但是在源码中,还是操作类对象调用的run().