java多线程之Runnable同时执行同一资源实例

原创 2017年08月13日 00:54:48

这是个卖票实例,采用多线程,模拟不同窗口来卖票,票数是共同资源。

 

piao.java

package tong;

public class piao implements Runnable {
    private static int count = 10;

    @Override

    public void run() {

        while (count > 0) {
            try {
                Thread.sleep(23);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            synchronized (this) {
                if (count > 0) {
                    count--;
                    System.out.println(Thread.currentThread().getName() + "卖出一张票,票还剩" + count);
                }

            }

        }

    }

}

chuangkou.java

package tong;

public class chuangkou {
public static void main(String[] args) {
    piao piao =new piao();
    
    Thread thread1 =new Thread(piao,"窗口1");
    Thread thread2 =new Thread(piao,"窗口2");
    Thread thread3 =new Thread(piao,"窗口3");
    Thread thread4 =new Thread(piao,"窗口4");
    thread1.start();
    thread2.start();
    thread3.start();
    thread4.start();
}  
}

开启四个窗口同时卖票,结果如下

窗口4卖出一张票,票还剩9
窗口1卖出一张票,票还剩8
窗口2卖出一张票,票还剩7
窗口3卖出一张票,票还剩6
窗口2卖出一张票,票还剩5
窗口1卖出一张票,票还剩4
窗口3卖出一张票,票还剩3
窗口4卖出一张票,票还剩2
窗口4卖出一张票,票还剩1
窗口1卖出一张票,票还剩0

多线程Runnable同时执行同一资源,必须考虑代码的原子性,对于初学者来说,线程访问的随机性,以及资源的分配有时分不清,初学者学一下java的原子性,可见性,有序性。就对这些问题清清楚楚了。

还有第一个程序piao.java,大家考虑两个问题

第一:把if (count>0){}去掉的结果

窗口3卖出一张票,票还剩9
窗口2卖出一张票,票还剩8
窗口1卖出一张票,票还剩7
窗口4卖出一张票,票还剩6
窗口4卖出一张票,票还剩5
窗口3卖出一张票,票还剩4
窗口2卖出一张票,票还剩3
窗口1卖出一张票,票还剩2
窗口3卖出一张票,票还剩1
窗口1卖出一张票,票还剩0
窗口2卖出一张票,票还剩-1
窗口4卖出一张票,票还剩-2
窗口3卖出一张票,票还剩-3

这个是思考线程的控制

第二:保持第一步。然后把synchronized改成把while(count>0)括住

窗口1卖出一张票,票还剩9
窗口1卖出一张票,票还剩8
窗口1卖出一张票,票还剩7
窗口1卖出一张票,票还剩6
窗口1卖出一张票,票还剩5
窗口1卖出一张票,票还剩4
窗口1卖出一张票,票还剩3
窗口1卖出一张票,票还剩2
窗口1卖出一张票,票还剩1
窗口1卖出一张票,票还剩0

这个是思考原子性的范围

相关文章推荐

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 ...

Java通过实现Runnable接口来创建线程

创建一个线程,最简单的方法是创建一个实现Runnable接口的类。 为了实现Runnable,一个类只需要执行一个方法调用run(),声明如下:public void run()你可以重写该方法,重...

Java 多线程之 Runnable VS Thread 及其资源共享问题

对于 Java 多线程编程中的 implements Runnable 与 extends Thread,部分同学可能会比较疑惑,它们之间究竟有啥区别和联系呢?他们是不是没啥区别随便选呢?实际中究竟该...

java多线程Runnable实例

  • 2014年01月24日 21:38
  • 365B
  • 下载

JAVA多线程之Runnable和Thread比较

在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些...

JAVA多线程之Thread VS Runnable

线程创建的两种方式: a,继承Thread类: class MyThread eatends Thread{ ...... @Override public void run(){ } } M...

JAVA多线程之Thread&&Runnable

看了个视频,嗯,记录下加深下理解。。。java实现多线程的两种方式:继承thread类,这种方式的缺陷就是java的单继承导致的;还有一种方式就是实现Runnable接口,这种方式避免了thread方...
  • z_zT_T
  • z_zT_T
  • 2016年08月01日 09:48
  • 1804

Java多线程之Thread VS Runnable(根据慕课网视频编写)

线程创建的两种方式比较 继承Thread类:class MyThread extends Thread{ ...... @Override public void run()...

java多线程之Runnable

public class Test implements Runnable { public static void main(String []args){ Test tt = new Tes...

java多线程之实现Runnable接口创建线程

实现Runnable接口创建线程类步骤如下: 1.创建实现Runnable接口的实现类 2.重写Runnable接口的run()方法 3.创建实现类的线程对象 4.将线程对象作为Thread的arge...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程之Runnable同时执行同一资源实例
举报原因:
原因补充:

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