一 利用Runnable接口来实现多线程,并在线程类中添加一个方法来实现获取线程中的信息

        下面是线程类 

        线程对外返回的是 digest 字节数组 。
        
package cn.bupt.thread;

import java.io.*;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ThreadDemo implements Runnable{

    
private File input ;
    
private byte [] digest ;
    
public ThreadDemo(File input)
    
{
        
this.input = input ;
    }

    
    
public byte [] getDigest()
    
{
        
return digest ;
    }

    
    
    @Override
    
public void run() {
    
        
try {
            FileInputStream in 
= new FileInputStream(input) ;
            MessageDigest sha 
= MessageDigest.getInstance("SHA") ;
            DigestInputStream din 
= new DigestInputStream(in , sha) ;
            
            
int b ;
            
            
while((b =  din.read()) != -1) ;
            din.close() ;
            
            digest 
= sha.digest() ;
            
            
        }
 catch (FileNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (NoSuchAlgorithmException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (IOException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

        
        
        
        
    }


     
    
}


         


  2  调用上面的线程类并接收返回的信息 

     
package cn.bupt.test;

import java.io.File;

import cn.bupt.thread.*;

public class Test {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        
        ThreadDemo [] td 
= new ThreadDemo[args.length] ; 
        
        
      
for(int i = 0 ; i < args.length ; i++){
          
          
/*计算摘要*/
          File f 
= new File(args[i]) ;
          td[i] 
= new ThreadDemo(f) ;
          Thread t 
= new Thread(td[i]) ;
          t.start() ;                   
      }

      
      
/*现在显示结果*/
      
for(int i = 0 ; i < args.length ; i++)
      
{
        StringBuffer result 
= new StringBuffer(args[i]) ;
        result.append(
"") ;
        
byte [] digest = td[i].getDigest() ;
      
        
forint j = 0 ; j < digest.length ; j++)
        
{          
          result.append(digest[j] 
+ " ") ;
        }

      
        System.out.println(
"result") ;
      }

      
      
        
    }


}




  上面的程序是错误的,原因是当调用getDigest 方法的时候,线程类并没有执行到获得digest的地方,
  所以在main函数中得到的代码是NULL pointer 。
  

3 下面通过 不停地询问检测, 线程返回信息的状态来判断是否已经完成操作 。
    代码如下:
   
package cn.bupt.test;

import java.io.File;

import cn.bupt.thread.*;

public class Test {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        
        ThreadDemo [] td 
= new ThreadDemo[args.length] ; 
        
        
      
for(int i = 0 ; i < args.length ; i++){
          
          
/*计算摘要*/
          File f 
= new File(args[i]) ;
          td[i] 
= new ThreadDemo(f) ;
          Thread t 
= new Thread(td[i]) ;
          t.start() ;                   
      }

      
      
/*现在显示结果*/
      
for(int i = 0 ; i < args.length ; i++)
      
{
        
        
while(true{
        
byte [] digest = td[i].getDigest() ;
        
        
        
if(digest != null)
        
{
          StringBuffer result 
= new StringBuffer(args[i]) ;
          result.append(
"") ;
          
forint j = 0 ; j < digest.length ; j++)
          
{          
            result.append(digest[j] 
+ " ") ;
          }

      
          System.out.println(
"result:" + result) ;
          
break ;
          }

        
        
         }

       }

          
    }


}


   上面的代码,通过while (true) ,死循环不停地检测当前的返回值,是否为空,不为空则打印。




















     
posted on 2010-07-14 10:27 buptduming 阅读(318) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: