从零基础接触java第七周第二节

  上一节我们跟大家分享了,我们的多线程,要用runnable来实现,这样才能实现达到共同运用一个目标的目的。

  昨天我跟大家举了一个卖票的案列,发现最后老是容易出现一个错误,就是有时会卖101张票,这是为什么呢?原因便在于,当我们每个线程运行第一次时,比如a线程先运行,但是只运行了一半,便被b线程抢了去,线程与线程之间也是互相争抢的,所以便出现了第一张票卖了两次的情况。那么我们该怎么办呢?不知道大家是否还记得前面我跟大家说到的同步代码块,这儿便会用到了。列如:

public class Test{
public static void main(String[] args){
Conductor c = new Conductor();
Thread t1 = new Thread(c,"卖票员1");
Thread t2 = new Thread(c,"卖票员2");
t1.start();
t2.start();
}
}
class Conductor implements Runnable{
int i = 100;
public void run(){
while(i>0){
synchronized (this) {
System.out.println(Thread.currentThread().getName()+"卖出第"+(i--)+"张票。");
}
}
}
}

仔细观察上面的代码,和昨天的代码比,我只是在while中加了个synchronize同步代码块,然后便解决了问题,这是为什么呢?因为同步代码块就好比一把锁,当我们a线程运行输出语句那句代码时,操作系统便把锁交给我们的a线程,然后b线程没有锁便抢不到,因为门锁着的,b线程进不去,然后a线程运行完后再次把锁释放了,然后两个线程又去抢,谁抢到锁,谁就运行,这就是同步代码块的作用。当然,有同步代码块,也有同步函数,所谓的同步函数就是把synchronize写到方法里面,而且不需要加括号,列如:

public class Test{
public static void main(String[] args){
Conductor c = new Conductor();
Thread t1 = new Thread(c,"卖票员1");
Thread t2 = new Thread(c,"卖票员2");
t1.start();
t2.start();
}
}
class Conductor implements Runnable{
int i = 100;
public void run(){
while(i>0){
this.get();
}
}
public synchronized void get(){
System.out.println(Thread.currentThread().getName()+"卖出第"+(i--)+"张票。");
}
}

列如以上案列,我重新写了个get方法,在返回参数类型前面加了synchronize,这样便是一个同步方法了。然后再在while里面运行。

  好了,关于线程我就讲完了,同样,多线程的用法是多种多样的,至于线程中的生产者消费者模式大家可以下来百度看看,我这儿是要以最简单的话让大家快速认识java,希望能对大家有所帮助,关于线程我这儿便讲解完毕了,有什么问题希望大家于评论下方提出,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值