从零基础接触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语言程序设计基础篇第七章编程练习题

1 import java.util.Scanner; public class Main{ public static void main(String[] args){ int maxSc...
  • gyhguoge01234
  • gyhguoge01234
  • 2016年07月09日 17:12
  • 3812

java语言程序设计基础篇第十二章编程练习题

1package yongheng; import java.util.Scanner;public class Calculator { public static void main(Str...
  • gyhguoge01234
  • gyhguoge01234
  • 2016年09月08日 22:21
  • 2537

java程序设计基础_陈国君版第五版_第七章例题

java程序设计基础_陈国君版第五版_第七章例题class Cylinder { private double radius; private int height; private doubl...
  • gaoenbin626
  • gaoenbin626
  • 2016年03月13日 14:47
  • 1037

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

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

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

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

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

前面跟大家讲了接口和多态,今天我来跟大家分享异常,在其中我会与大家大概分享一下object,同时关于设计模式由于我这儿是为大家大概讲述java,让大家方便以后学习,所以我的主要目的是让大家以最短的时间...
  • M_F_X_B_K
  • M_F_X_B_K
  • 2016年08月24日 08:38
  • 108

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

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

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

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

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

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

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

  • hackeraaa
  • hackeraaa
  • 2016年04月03日 11:09
  • 163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从零基础接触java第七周第二节
举报原因:
原因补充:

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