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 VS Runnable 【带案例】

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

Java多线程——thread及runnable的基本使用及交替执行

/** * Created by LiuHuiChao on 2016/3/11. */ public class Actor extends Thread { @Override ...
  • ShuiTianNaiLuo
  • ShuiTianNaiLuo
  • 2016年03月11日 17:05
  • 1450

java多线程之引入Runnable

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

java挑战高并发(6):Runnable和Thread实现多线程的区别(含代码)

Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下...
  • A1023824314
  • A1023824314
  • 2016年07月29日 23:43
  • 1969

多线程实现方式---实现Runnable接口

多线程实现方式---实现Runnable接口 多线程实现方式---实现Runnable接口 一个类如果需要具备多线程的能力,也可以通过实现java.lang.Runnable接口进行实现。按照...
  • chen_shiqiang
  • chen_shiqiang
  • 2016年05月05日 11:00
  • 3598

JAVA多线程不安全问题解决方案(多线程并发同一资源)。

引例:吃苹果比赛,3个人同时吃50个苹果,谁先拿到谁就吃,每个哦ing过都有编号。 问题: 多线程同时执行的时候可能出现不安全问题 当3个人同时拿到一个苹果,他们的编号就一样,当时主要看是谁先吃掉苹果...
  • blank__box
  • blank__box
  • 2017年04月24日 10:28
  • 1018

Java实现Runnable接口方式实现多线程的优势

1.继承Threadpackage com.test.thread;public class TicketThread1 extends Thread { private int ticket...
  • RichieZhu
  • RichieZhu
  • 2016年01月28日 14:23
  • 1208

【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月06日 10:15
  • 37074

JAVA多线程之Runnable和Thread比较

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

实现Runnable接口的多线程可以实现属性共享的原因

为什么实现Runnable接口来创建的线程可以实现数据共享? 先来看看我们是实现Runnable接口时是如何启动线程的: class R implements Runnable{}        ...
  • zuolovefu
  • zuolovefu
  • 2014年10月19日 18:13
  • 2228
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程之Runnable同时执行同一资源实例
举报原因:
原因补充:

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