一、知识点

1、vector

Vector类在java中实现自动增长的对象数组,相对于ArrayList来说是线程安全的

2、线程中返回数据

节省资源的做法是线程执行完毕,调用主线程中的方法。而不必等待或轮询

定义一个监听器接口Listener

编写线程对象,实现Runnable的run方法,增加addListener方法,用来添加调用该线程的实例(实例均要求实现监听器的方法)

主线程实现Listener接口的回调方法,线程执行完就能通过接口调用实例的方法

二、部分示例代码

 
  1. public interface DigestListener { 
  2.     public void digestCalculated(byte[] digest); 
 
  1. List listenerList = new Vector(); 
  2.      
  3.     public synchronized void addDigestListener(DigestListener l){ 
  4.         listenerList.add(l); 
  5.     } 
 
  1. private synchronized void sendDigest(byte[] digest){ 
  2.         ListIterator iterator = listenerList.listIterator(); 
  3.         while(iterator.hasNext()){ 
  4.             DigestListener dl = (DigestListener) iterator.next(); 
  5.             dl.digestCalculated(digest); 
  6.         } 
  7.     } 
  8.      
  9.     @Override 
  10.     public void run() { 
  11.         try { 
  12.             FileInputStream in = new FileInputStream(input); 
  13.             MessageDigest sha = MessageDigest.getInstance("SHA"); 
  14.             DigestInputStream din = new DigestInputStream(in,sha); 
  15.             while(din.read()!=-1); 
  16.             din.close(); 
  17.             byte[] digest = sha.digest(); 
  18.             this.sendDigest(digest); 
  19.         } catch (Exception e) { 
  20.             e.printStackTrace(); 
  21.         } 
  22.     } 
 
  1. @Override 
  2.     public void digestCalculated(byte[] digest) { 
  3.         this.digest = digest; 
  4.         System.out.println(this); 
  5.     } 
  6.      
  7.     public static void main(String[] args) { 
  8.         ListCallbackDigestUserInterface d =  
  9.                 new ListCallbackDigestUserInterface(new File("1.txt")); 
  10.         d.calculateDigest(); 
  11.     }