关闭

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

标签: java初始学习
67人阅读 评论(0) 收藏 举报
分类:

  上一节我们跟大家分享了,我们的多线程,要用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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1714次
    • 积分:257
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:0篇
    • 译文:0篇
    • 评论:6条
    文章分类
    文章存档