183 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| package com.novelbook.android.service;
 | |
| 
 | |
| import android.app.IntentService;
 | |
| import android.content.Intent;
 | |
| import android.util.Log;
 | |
| 
 | |
| public class ChapterDownloadSvrc extends IntentService {
 | |
|     static final String TAG= "ChapterDownloadSvr";
 | |
| 
 | |
|     public ChapterDownloadSvrc() {
 | |
|         super(TAG);
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public void onCreate() {
 | |
|         super.onCreate();
 | |
|         // 创建一个初始化线程,若干个买票线程
 | |
|         // 要等初始化线程初始化好了之后,才能买票
 | |
| 
 | |
|         // 创建一个Ticket类的对象,分别传给不同的线程
 | |
|         Ticket ticket = new Ticket();
 | |
| 
 | |
|         Thread t1 = new InitTicketThread("初始化线程", ticket);
 | |
| 
 | |
|         // 等初始化线程初始化好车票之后,才能开始卖票
 | |
|         try {
 | |
|             t1.join();
 | |
|         } catch (InterruptedException e) {
 | |
|             e.printStackTrace();
 | |
|         }
 | |
| 
 | |
|         // 创建四个买票线程,开始卖票
 | |
|         Thread t2 = new SaleTicketThread("卖票线程1", ticket);
 | |
|         Thread t3 = new SaleTicketThread("卖票线程2", ticket);
 | |
|         Thread t4 = new SaleTicketThread("卖票线程3", ticket);
 | |
|         Thread t5 = new SaleTicketThread("卖票线程4", ticket);
 | |
| 
 | |
|         Log.d(TAG,"---------------------------------------------------------------------");
 | |
|         Log.d(TAG,"test service ChapterDownloadSvrc onCreate...");
 | |
|     }
 | |
| 
 | |
| @Override
 | |
| public void onStart(Intent intent, int startId) {
 | |
|     super.onStart(intent, startId);
 | |
|     Log.d(TAG,"test service onStart");
 | |
| }
 | |
| 
 | |
|     @Override
 | |
|     public int onStartCommand(Intent intent, int flags, int startId) {
 | |
|         Log.d(TAG,"test service onStartCommand");
 | |
|         return super.onStartCommand(intent, flags, startId);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public void onDestroy() {
 | |
|         Log.d(TAG,"test service onDestroy");
 | |
|         super.onDestroy();
 | |
|     }
 | |
| 
 | |
|    /* @Override
 | |
|     protected void onHandleIntent(Intent intent) {
 | |
|         Log.d(TAG,"test service ChapterDownloadSvrc onHandleIntent...");
 | |
|     }*/
 | |
| 
 | |
|      @Override
 | |
|     protected void onHandleIntent( Intent intent) {
 | |
|         Log.d(TAG,"test service onHandleIntent...");
 | |
|          Log.d(TAG,"test service ChapterDownloadSvrc onHandleIntent...");
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 创建车票类、初始化车票
 | |
|      * @author haokui
 | |
|      *
 | |
|      */
 | |
|     class Ticket {
 | |
|         // 初始化200张票的空间
 | |
|         private String[] tickets = new String[200];
 | |
| 
 | |
|         private int index = tickets.length - 1; // 指向数组的索引(第一张票)
 | |
| 
 | |
|         public Ticket() {
 | |
| 
 | |
|         }
 | |
| 
 | |
|         public void initTicket() {
 | |
|             // 初始化车票,给数组的元素赋值,考虑是否要同步
 | |
|             for (int i = 0; i < tickets.length; i++) {
 | |
|                 tickets[i] = "第" + (i + 1) + "号车票";
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public synchronized String saleTicket() throws NoTicketException {
 | |
|             // 判断是否有票,有票的情况下再卖票,没有票呢,抛出异常,
 | |
|             // 考虑是否需要同步
 | |
| 
 | |
|             if (index >= 0) {
 | |
|                 String s = tickets[index];
 | |
| 
 | |
|                 // 故意制造了一个问题,出现多个线程共卖一张车票
 | |
|                 try {
 | |
|                     Thread.sleep(10);
 | |
|                 } catch (InterruptedException e) {
 | |
|                     // TODO Auto-generated catch block
 | |
|                     e.printStackTrace();
 | |
|                 }
 | |
|                 tickets[index] = null;
 | |
|                 index--;
 | |
|                 return s;
 | |
|             } else {
 | |
|                 throw new NoTicketException("没有车票了");
 | |
|             }
 | |
| 
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * 创建卖票线程类
 | |
|      * @author haokui
 | |
|      *
 | |
|      */
 | |
|     class SaleTicketThread extends Thread {
 | |
| 
 | |
|         private Ticket ticket;
 | |
| 
 | |
|         public SaleTicketThread(String name, Ticket ticket) {
 | |
|             super(name);
 | |
|             this.ticket = ticket;
 | |
|             this.start();
 | |
|         }
 | |
| 
 | |
|         // 在run方法中卖车票
 | |
|         public void run() {
 | |
|             for (int i = 0; i < 60; i++) {
 | |
|                 try {
 | |
|                     String s = ticket.saleTicket();
 | |
|                     System.out.println(this.getName() + "卖票成功========>" + s);
 | |
|                 } catch (NoTicketException e) {
 | |
|                     System.out.println(this.getName() + " 卖票时发生异常!");
 | |
|                     e.printStackTrace();
 | |
| 
 | |
|                     // 如果发生异常,说明没有车票了,就中断循环,不要在卖票了
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * 初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组
 | |
|      * @author haokui
 | |
|      *
 | |
|      */
 | |
|     class InitTicketThread extends Thread {
 | |
|         private Ticket ticket;
 | |
|         public InitTicketThread(String name, Ticket ticket) {
 | |
|             super(name);
 | |
|             this.ticket = ticket;
 | |
|             this.start();
 | |
|         }
 | |
| 
 | |
|         // 在run方法中初始化车票
 | |
|         public void run() {
 | |
|             ticket.initTicket();
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * 自定义异常
 | |
|      * @author haokui
 | |
|      *
 | |
|      */
 | |
|     class NoTicketException extends Exception {
 | |
|         public NoTicketException() {
 | |
| 
 | |
|         }
 | |
| 
 | |
|         public NoTicketException(String msg) {
 | |
|             super(msg);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |