日期:2014-05-17  浏览次数:20680 次

java多线程问题求教
各位大侠麻烦看一下,写了一段多线程调度本地命令的scp的代码。主要任务就是用scp命令将TEMPDIR文件夹下的文件复制到另一台叫做node2的机子上面去。想要减少传输的时间,所以采用了多线程调用scp命令写的。
结果问题出现了,每次传输的文件总是不全,比如TEMPDIR文件夹下有14个文件,那么只有10个文件可以传到node2上;如果有22个文件,那么就可能只有20个文件传到node2上去了,这是怎么回事呢?麻烦大侠们给看一下

Java code
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class test {

    /**
     * @param args
     * @throws IOException 
     */
    
    private final static String TEMPDIR = "/home3/boweiy/hadoopdir/temp/";


    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        FileToNameNodeForExp();
        
    }
    
    public static boolean FileToNameNodeForExp()
    {
        boolean done = false;
        String[] fNames = new File(TEMPDIR).list();
        
        int fn = fNames.length;
        System.out.println(fn);
        for(int i = 0; i < fn; i++)
        {
            System.out.println(fNames[i]);
            Thread t = new Thread(new UpThread("node2", TEMPDIR + fNames[i]));
            t.start();
            if(Thread.currentThread().isInterrupted())
                System.out.println("Something wrong:" + fNames[i]);
        }
        return done;
    }

}
class UpThread implements Runnable {

    private String namenode;
    private String filename;

    public UpThread(String namenode, String filename) {
        this.namenode = namenode;
        this.filename = filename;
    }

    public void run() {
        // TODO Auto-generated method stub
        String com = "scp " + filename + " boweiy@" + namenode
                + ":/home/boweiy/temp/";
        
        String[] coms = new String[3];
        coms[0] = "scp";
        coms[1] = filename;
        coms[2] = "boweiy@" + namenode+ ":/home/boweiy/temp/";
        Process process;
        try {
            process = Runtime.getRuntime().exec(coms);
            process.waitFor();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}



------解决方案--------------------
你可以指定线程处理一定规则名称的文件
假如你的文件名是数字结尾 你用2个线程去传文件
那么0-4 就是一个线程 5-9就是一个线程
你传文件时先得到文件夹下的文件列表 然后按规则传文件
只是一个思路~~
------解决方案--------------------
而且最好用一个properties文件 记录下你当前传的文件的名称 
否则程序重启 你就不知道从那个开始传了
------解决方案--------------------
main方法中主线程没有sleep足够长时间等待其他线程完成,造成动作慢的线程被夭折了?
------解决方案--------------------
LZ的代码,用本机copy命令试过了,倒是没有问题。

是不是可以怀疑是scp的问题?

或者你应该监视拷贝动作是否成功,不成功则需要重试?
------解决方案--------------------
程序没什么问题,会不会是scp 不支持多线程操作。?