多线程通讯轮询卖票了解一下

package com.xp.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ABC_Lock {

public static void main(String[] args) {
    Print print = new Print();

    // new Thread(new Runnable() {
    // @Override
    // public void run() {
    // for (int i = 1; i <= 34; i++) {
    // print.loopA(i);
    // }
    // }
    // }, "A").start();
    // new Thread(new Runnable() {
    // @Override
    // public void run() {
    // for (int i = 1; i <= 33; i++) {
    // print.loopB(i);
    // }
    // }
    // }, "B").start();
    // new Thread(new Runnable() {
    // @Override
    // public void run() {
    // for (int i = 1; i <= 33; i++) {
    // print.loopC(i);
    // }
    // }
    // }, "C").start();
    // }
    int i = 33;
    while (i > 0) {
        i--;
        new Thread(new Runnable() {
            @Override
            public void run() {
                print.loopA();
            }
        }, "A").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                print.loopB();
            }
        }, "B").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                print.loopC();
            }
        }, "C").start();
    }

}

}

class Print {
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();

int tick = 100;
String mark = "a";

public void loopA() {
    lock.lock();
    try {
        if (!"a".equals(mark)) {
            try {
                conditionA.await();
            } catch (InterruptedException e) {
            }
        }
        System.out.println(Thread.currentThread().getName() + "完成售票,剩余: " + --tick);
        mark = "b";
        conditionB.signal();
    } finally {
        lock.unlock();
    }
}

public void loopB() {
    lock.lock();
    try {
        if (!"b".equals(mark)) {
            try {
                conditionB.await();
            } catch (InterruptedException e) {
            }
        }
        System.out.println(Thread.currentThread().getName() + "完成售票,剩余: " + --tick);
        mark = "c";
        conditionC.signal();
    } finally {
        lock.unlock();
    }
}

public void loopC() {
    lock.lock();
    try {
        if (!"c".equals(mark)) {
            try {
                conditionC.await();
            } catch (InterruptedException e) {
            }
        }
        System.out.println(Thread.currentThread().getName() + "完成售票,剩余: " + --tick);
        mark = "a";
        conditionA.signal();
    } finally {
        lock.unlock();
    }
}

}

原文地址:http://blog.51cto.com/13306517/2131219

时间: 2024-10-05 21:50:20

多线程通讯轮询卖票了解一下的相关文章

多线程之多窗口卖票&amp;线程之间的通信

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票) 卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁! package cn.itcast.thread2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int ticke

多线程系列1:经典卖票

1.卖票的方法 class TicketRest { int ticket = 1; int Max = 0; public TicketRest(int max) { Max = max; } /// <summary> /// 未加锁 /// </summary> /// <param name="num"></param> public void SellTicketNoLock(int num) { while (ticket &

Java多线程练习:ticket卖票程序

/*需求:简单的卖票程序多个窗口买票 */ class Ticket extends Thread{    private static int tick=100;    public void run()    {        while(true)        {            if(tick>0)            {                System.out.println(Thread.currentThread().getName()+"sale:--

《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 5. 轮询通讯模型开发及注意事项... 2 4.1           概述... 2 4.2           通讯机制说明... 2 4.3           设备驱动开发注意事项... 3 4.3.1    实时发送数据... 3 4.3.2    优先发送其他数据... 3 4.4           宿主程序服务实例配置注意事项... 4 4.5           轮询

Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

摘要 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯 方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events).本文将简要介绍这4种技术的原理,并指出各自的异同点.优缺点等. 1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询. Comet技术.WebSocket技术.SSE(Server-se

java多线程实现卖票小程序

1 package shb.java.demo; 2 /** 3 * 多线程测试卖票小程序. 4 * @Package:shb.java.demo 5 * @Description: 6 * @author shaobn 7 * @Date 2015-9-2下午7:49:53 8 */ 9 public class TestSyn { 10 public static void main(String[] args) { 11 //此注释为实现方式一 12 /*TicketDemo td = n

java多线程实现卖票程序

本文采用java多线程实现了模拟车站多个车票卖票的功能. 关键词:java多线程 共享变量 实现runnable接口 volatile  线程同步. 代码如下 Ticket类 package ex7_TicketSaler; /*同一对象的多个线程thread0/1/2,对共享变量count的操作,需要将count的值声明为volatile * 并且因为多个线程操作的是同一个对象ticket,因此count是资源共享的 * */ public class Ticket implements Ru

如何通过多线程轮询待发送邮件进行发送

默认情况下,C# 程序具有一个线程.此线程执行程序中以 Main 方法开始和结束的代码.Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止.不过,可以创建辅助线程,以便与主线程一起并行执行代码.这些线程通常称为“辅助线程”. 多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态.多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务.为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与

多线程(多窗口卖票例子)

实现多线程的方式: 实现多线程的方式有多种,这里只列举两种常用的,而第一种继承Thread的方式无法实现多窗口卖票. 一,继承Thread方式: 特点:多线程多实例,无法实现资源的共享. 例子: 1 package com.demo.study.multithreading; 2 3 public class MyThread extends Thread{ 4 5 private int i = 10; 6 // 可以自行定义锁,也可以使用实例的锁 7 Object mutex = new O