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); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | } |