您的位置:首页 > 编程语言 > Java开发

java从0开始学习第十二课-多线程是如此的简单

2016-05-08 15:27 197 查看

  今天来给大家稍微讲一下什么是多线程,为什么是稍微讲一下呢?因为这个多线程是非常非常

复杂的,我还没想好怎么讲,我觉得,要想通过一个博客就把多线程给讲明白是不现实的,还是

要大家多看书,多实践。大家都知道实践是多么重要的,就好像咱们的岛国片子一样,只看不动

手有意思?

  

  首先,明确一下我们今天要学习的内容:1、什么是多线程,2、开干一个多线程项目,大家做

完这个项目立马就可以装逼。

 

1、什么是多线程?多线程就是有几个线程,不止一个。那什么是线程?线程是进程的一部分,是

 

程序执行的基本单元。

 

2、开干什么项目?我们经常用到的一个场景,取钱和存钱。假设小明有一张银行卡,他的老婆叫

小红。小明负责用支付宝存钱,小红负责在超市逛街刷卡,而且我们假设小明的银行卡最多只能存600块钱(项目需要··),而且不准透支。马上开干啦!

 

首先要定义一个帐号类:

 

class Account{
private int money;
public synchronized void saveMoney(int num){//存钱的动作
if(money>=600){
System.out.println("你的卡已经很多钱了,不准再存了!!");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money+=num;
System.out.println("存钱成功,存入:"+num+",卡上余额:"+money);
notify();
}
public synchronized void takeMoney(int num){ //取钱的动作
if(num>money){
System.out.println("你没钱了,叫小明快点打钱过来");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money-=num;
System.out.println("刷卡成功,消费金额:"+num+",卡上余额:"+money);
notifyAll();
}
}

 

 

     非常有必要给大家讲一下这个synchronized(同步)是什么意思。我们加上这个玩意(一般都叫他‘锁’)之后,当一个线程t1获得了这个锁之后,其他的对象t2不能再对这个帐号进行操作了,T2就处于了阻塞的状态,当t1调用了wait()方法之后,t2就可以进行takeMoney了。

  通俗的讲,某女优(有怪癖)只能被一个男优a搞,不允许一起来,当男优a不行了(wait()),那么男优b才能搞该女优

 

我们再定义2个线程类,存钱类和取钱类,都来继承一下牛逼的Thread类。

 

class ThreadTake extends Thread{
Account a;
public ThreadTake(Account account){
this.a=account;
}
@Override
public void run() {
int i=0;
while(i<5){
a.takeMoney(200);
i++;
}
}
}

class ThreadSave extends Thread{
Account a;
public ThreadSave(Account account){
this.a=account;
}
@Override
public void run() {
int i=0;
while(i<5){
a.saveMoney(200);
i++;
}
}
}

 然后是main方法:

 

 

public static void main(String[] args) {
Account account=new Account();
Thread t1=new ThreadSave(account);
Thread t2=new ThreadTake(account);
t1.start();
t2.start();
}

 

 

最后我们跑起来看看是什么样的?

存钱成功,存入:200,卡上余额:200
存钱成功,存入:200,卡上余额:400
存钱成功,存入:200,卡上余额:600
你的卡已经很多钱了,不准再存了!!
刷卡成功,消费金额:200,卡上余额:400
刷卡成功,消费金额:200,卡上余额:200
刷卡成功,消费金额:200,卡上余额:0
你没钱了,叫小明快点打钱过来
存钱成功,存入:200,卡上余额:200
存钱成功,存入:200,卡上余额:400
刷卡成功,消费金额:200,卡上余额:200
刷卡成功,消费金额:200,卡上余额:0

 好啦,是不是非常简单啊。多线程就这点招,你们都会了吗?如果认为自己搞熟悉了,再多搞几次,男人一定要让自己能干一点!!!

 

 其实我们刚才实现多线程是继承了所谓的Thread类,其实还有一个方法是实现传说中的Runnable接口。一会大家可是搞搞她,如果能搞定她,说明你们的能力又提升了。

 

这个Runnable和Thread有什么区别呢?大家记住一点,没啥区别,但是java可以实现多个接口,只可以继承一个类,这个就是他们最大的区别,而且这个Thread类也是实现Runnable。建议多用Runnable!!!!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: