当前位置: 代码迷 >> Java Web开发 >> java多线程有关问题求教
  详细解决方案

java多线程有关问题求教

热度:94   发布时间:2016-04-17 00:47:58.0
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 不支持多线程操作。?
  相关解决方案