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多线程之Runnable

public class Test implements Runnable { public static void main(String []args){ Test tt = new Tes...
  • qq_36090306
  • qq_36090306
  • 2017年03月16日 20:01
  • 105

java 多线程等待与唤醒机制

java 并发编程网站 :http://ifeve.com/java-7-concurrency-cookbook/ 一: 1:JVM线程状态 NEW, RUNNABLE, BLOC...
  • baiducheng
  • baiducheng
  • 2017年12月25日 16:08
  • 66

Java【多线程知识总结(6)】使用Runnable接口创建多线程,处理同一个资源

//模拟售票厅售票情况:假设有10张票,有4个售票窗口.//用继承Thread创建线程的方式 /* class TicketMan { public static void main(String[...
  • StellaAh
  • StellaAh
  • 2011年10月06日 14:45
  • 4988

java 多线程 future 基本原理

/** * Date:2016年9月7日下午7:56:03 * Copyright (c) 2016, www.bwbroad.com All Rights Reserved. * */ p...
  • xuejianxinokok
  • xuejianxinokok
  • 2016年09月12日 22:23
  • 522

java多线程之引入Runnable

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 本节用一种新的方式重新实现Counter示...
  • pony_maggie
  • pony_maggie
  • 2015年01月04日 22:04
  • 7455

多线程之Runnable

由于Java只能单继承,所以有时候我们不能通过继承extends来开启一个线程,这个时候我们就可以通过implements Runnable来开启一个线程,实验代码如下:package learnIn...
  • baidu_15113429
  • baidu_15113429
  • 2016年10月13日 11:16
  • 142

Java多线程之 Thread VS Runnable 【带案例】

为此,我们举个例子,假设有火车站有三个窗口,在卖火车票,总共只有5张票。每一个线程相当于一个窗口,分别售票 package com.thread; class myThread extends T...
  • uniquewonderq
  • uniquewonderq
  • 2015年08月31日 18:33
  • 1236

实现Runnable,轻松实现多线程间的资源共享

实现Runnable,轻松实现多线程间的资源共享
  • l715181215
  • l715181215
  • 2016年04月04日 14:43
  • 165

java 之 多线程Runnable 示例

import java.awt.BorderLayout; import java.awt.HeadlessException; import javax.swing.JFrame; import ...
  • EthanQ
  • EthanQ
  • 2012年02月20日 14:14
  • 2632

java多线程简单小例子2——实现Runnable接口

/** * 实现Runnable接口的类 * * @author */ public class DoSomething implements Runnable { private S...
  • u011402596
  • u011402596
  • 2015年03月25日 00:32
  • 1489
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程之Runnable同时执行同一资源实例
举报原因:
原因补充:

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