使用Java多線程模簡單擬售票系統

來源:互聯網
上載者:User

標籤:

建立單個“火車票類”
package date0804.demo3;/** * 票 * @author zzw922cn * */public final class Ticket {private final String name;public Ticket(String name) {super();this.name = name;}public String getName() {return name;}}



火車票DB的構建

採用靜態工廠生產火車票的模式:

package date0804.demo3;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.security.DigestInputStream;import java.security.MessageDigest;import java.util.ArrayList;import javax.xml.bind.DatatypeConverter;public class TicketFactory {private ArrayList<Ticket> list = new ArrayList<Ticket>();private String str="seed";private final int NUMBER_OF_TICKETS=100;private TicketFactory() {//產生火車票for(int count=0;count<NUMBER_OF_TICKETS;count++) {InputStream inputStream = new ByteArrayInputStream(str.getBytes());        MessageDigest instance;try {instance = MessageDigest.getInstance("MD2");DigestInputStream digestInputStream = new DigestInputStream(inputStream, instance);while(digestInputStream.read()!=-1)    ;digestInputStream.close();byte[] digest = instance.digest();str=DatatypeConverter.printHexBinary(digest);list.add(new Ticket(str));}catch(Exception ex) {ex.printStackTrace();}}}private static TicketFactory ticketFactory=new TicketFactory();public static ArrayList<Ticket> getTickets() {return ticketFactory.list;}}



火車票的操作與DB的變更
package date0804.demo3;/** * 售票系統 */import java.util.ArrayList;import java.util.HashMap;import java.util.Map;/** * 多線程類比火車票售票系統 * @author zzw922cn * */public class TicketOperation {private ArrayList<Ticket> list;public TicketOperation(ArrayList<Ticket> list) {this.list=list;}public Map<Integer,Ticket> sell(){synchronized (this) {HashMap<Integer, Ticket> hashMap=new HashMap<Integer, Ticket>();if(list.size()>0) {Ticket ticket=list.get(0);list.remove(0);int size=list.size();hashMap.put(size, ticket);return hashMap;}else {return null;}}}}



購票行為線程
package date0804.demo3;import java.io.File;/** * 買票 */import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class BuyTicketRunnable implements Runnable {private TicketOperation ticketDb;private String content;File file=new File("ticket.log");public BuyTicketRunnable(TicketOperation ticketDb) {this.ticketDb = ticketDb;}@Overridepublic void run() {Map<Integer,Ticket> map=ticketDb.sell();if(map!=null) {Set<Entry<Integer, Ticket>> entrySet = map.entrySet();Iterator<Entry<Integer, Ticket>> iterator2 = entrySet.iterator();Entry<Integer, Ticket> next = iterator2.next();int size=next.getKey();Ticket ticket=next.getValue();content="Thread "+Thread.currentThread().getId()+"買了一張票:"+ticket.getName()+"剩餘票數為"+size;}else {content="Thread "+Thread.currentThread().getId()+"票已售空";}//記錄日誌WritingThread writingThread = new WritingThread(file,content);writingThread.start();}}



日誌記錄
package date0804.demo3;/** * 記錄日誌 */import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Date;public class LoggingFile {private Writer out;public LoggingFile(File f) throws IOException {FileWriter fileWriter = new FileWriter(f,true);//使用緩衝封裝寫入器,能夠增加效率this.out = new BufferedWriter(fileWriter);}public void writeLogs(String message) throws IOException {synchronized(out) {Date d=new Date();StringBuilder stringBuilder = new StringBuilder(d.toString());stringBuilder.append(‘\t‘);stringBuilder.append(message);stringBuilder.append("\r\n");out.write(stringBuilder.toString());System.out.println(stringBuilder.toString());}}public void close() throws IOException {out.flush();out.close();}}



日誌的寫入線程
package date0804.demo3;/** * 日誌寫入檔案 */import java.io.File;import java.io.IOException;public class WritingThread extends Thread {private File logFile;private String content;public WritingThread(File logFile,String content) {this.logFile=logFile;this.content=content;}@Overridepublic void run() {try {LoggingFile loggingFile = new LoggingFile(logFile);loggingFile.writeLogs(content);loggingFile.close();} catch (IOException e) {e.printStackTrace();}}}



測試類別
package date0804.demo3;import java.io.IOException;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.concurrent.ExecutionException;public class Test {private final static int NUMBER_OF_BUYERS=120;public static void main(String[] args) throws InterruptedException, IOException, NoSuchAlgorithmException, ExecutionException {ArrayList<Ticket> list=TicketFactory.getTickets();TicketOperation ticketOperation = new TicketOperation(list);BuyTicketRunnable buyTicketThread = new BuyTicketRunnable(ticketOperation);for(int i=0;i<NUMBER_OF_BUYERS;i++) {Thread thread= new Thread(buyTicketThread);thread.start();}}}



使用Java多線程模簡單擬售票系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.