Java---12---多线程练习:卖票---实现数据共享
来源:互联网 发布:伦敦银交易软件 编辑:程序博客网 时间:2024/06/10 04:20
做一个练习:卖票小程序,实现数据共享。
我们先来创建线程,和主线程交替运行。
这个就比较简单了:
就以继承Thread类的方式来说吧:
class MyThread extends Thread{ private int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } }}public class THREAD{ public static void main (String[] args) { MyThread a = new MyThread("My"); MyThread b = new MyThread("Your"); a.start(); b.start(); }}
通过这个例子我们可以发现 num的值被重复打印,这与我们实际生活中的现象是不相符的,比如说:卖票。
火车站卖票的时候是多个窗口同时进行的,但是却没有发现有重复的票。
创建四个线程,相当于四个窗口来卖票:
class MyThread extends Thread{ private int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } }}public class THREAD{ public static void main (String[] args) { MyThread a = new MyThread("one"); MyThread b = new MyThread("two"); MyThread c = new MyThread("three"); MyThread d = new MyThread("four"); a.start(); b.start(); c.start(); d.start(); }}
但是运行结果显示,每张票都被重复卖了四次,如果现实生活中发生这种情况,那回家还有买不到票的?
如何解决。
将num变量声明为static的。
将数据定义成static 静态的,实现数据共享:
class MyThread extends Thread{ private static int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } }}public class THREAD{ public static void main (String[] args) { MyThread a = new MyThread("one"); MyThread b = new MyThread("two"); MyThread c = new MyThread("three"); MyThread d = new MyThread("four"); a.start(); b.start(); c.start(); d.start(); }}
继承Thread类的方式已经实现数据共享,但是一般我们不定义静态的,因为静态的生命周期太长。
那么用实现Runnable接口方式又该怎么实现呢?
我们先用这种方式创建四个线程来实现线程的运行。
class MyThread implements Runnable{ private static int num = 150; public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } }}public class THREAD{ public static void main (String[] args) { MyThread a = new MyThread(); Thread a1 = new Thread(a); Thread a2 = new Thread(a); Thread a3 = new Thread(a); Thread a4 = new Thread(a); a1.start(); a2.start(); a3.start(); a4.start(); }}
一运行我们发现,卖票的程序已经实现了,已经实现数据共享了。这是怎么回事?
为什么用实现Runnable接口的方式就可以呢?
那么先来想一下这个问题:
为什么要将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数?
因为,自定义的run方法所属的对象是Runnable接口的子类对象,
而线程启动之后也要运行run方法,但是新 new 的Thread对象却没有复写run方法。
线程要运行必须要有run方法,但是自己却没有,所以要明确run方法所属的对象。就相当于借用的Runnable子类对象的run方法。
至此,卖票程序的两种方式已经实现。
点击打开链接
1 2
- Java---12---多线程练习:卖票---实现数据共享
- JAVA多线程实现模拟卖票
- java多线程实现数据共享
- 实现Runnable 多线程卖票
- 多线程runnable实现卖票
- Java 多线程卖票演示
- Java多线程-卖票
- Java 多线程卖票
- java多线程卖票问题。
- Java 多线程卖票例子
- Java 多线程实现多个窗口同时卖票
- java实现多线程卖票(重点分析Thread.sleep())
- 多线程实现卖票的例子
- IOS学习 多线程NSThread 共享变量 卖票
- JAVA多线程共享数据
- Java多线程共享数据
- java多线程:6、模拟卖票
- Java多线程实例之卖票
- UVA - 10976 Fractions Again?!
- 猜想关于win10支持安卓应用的可能
- Gvim、Gcc、cvim编译c
- 网络编程Socket之wireshark使用
- 集合框架的用法 。
- Java---12---多线程练习:卖票---实现数据共享
- it Ebook 免费
- Android之反编译
- C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 编程匠艺
- Ubuntu 10.04下安装Source Navigator 一步一步教你如何安装
- 微信native方式支付中body为中文时签名错误解决方法
- windows下编译ffmpeg源代码
- 神秘博士 Doctor.Who.2005