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

原创 2016年08月30日 08:50:34

  上一节我们跟大家分享了,我们的多线程,要用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,希望能对大家有所帮助,关于线程我这儿便讲解完毕了,有什么问题希望大家于评论下方提出,谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

前面两周给大家介绍了if和while,今天来给大家说说switch和for,我在前面说过,后期我们将经常接触到它们,就像四大发明一样。   接下来给大家讲一讲switch,这个我们可以把它看做指南针,...

从零基础接触java第九章第二节

上一节我跟大家分享了io流中最基础的File,本节我跟大家继续分享io流中的输入流和输出流。   上一节中我跟大家分享的流中大家不知道下来熟悉过没有,都是用于我们创建文件和文件夹,然后还有便是用于我...

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

上一节跟大家分享了多线程,然后那只是多线程的冰山一角,接下来继续与大家分享多线程。   上一节跟大家说到,多线程必须继承一个Thread类,然后实现里面的run方法,最后通过调用Thread里面的s...

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

前面我跟大家简单地分享了多线程,但是我这儿少了进程和进程之间关系的生产者和消费者,以及线程池大家下来都可以去百度看看。   今天我要跟大家分享的是泛型。什么是泛型?前面我给大家说了类,以及我们定义变...

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

上一节已经跟大家分享到了泛型的通配符方面了,本节将继续与大家分享泛型。   关于泛型,除了通配符之外,还涉及了一个知识点便是extends和super,相信这两个单词大家一定很熟悉,没错,前面我们学...

大数据工程师:大数据的java基础 第七周

复变函数第二节基础讲解

  • 2010-03-13 15:56
  • 1.63MB
  • 下载

HTML第二节(网页结构基础 一)

正如下图 网页主要分为head 和body两部分,接下来我们一一来学习其中的元素 1.标题元素(......  ) 1.需要注意就是标题元素包含的文本前后自动添加空白 2.h1字号最大 h6字号最...

学习javascript基础知识系列第二节 - this用法

通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)