我有一个简单的程序。她制作了所选文件的多个副本。请解释一下,我怎样才能通过使用线程来加快复制过程?
//主类(接口):
SynchronizationContext
//打开文件的程序:
public class Main extends JFrame{
static JButton bt1, bt2, bt3;
static JLabel lb1, lb2, lb3;
static JTextField tf1;
static int copyCount;
eHandler handler = new eHandler();
public static void main (String args[]){
Main m = new Main("заголовок");
m.setVisible(true);
m.setLocationRelativeTo(null);
m.setSize(150, 100);
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m.setResizable(false);
}
public Main(String s){
super(s);
setLayout (new GridLayout(3, 1, 1, 1));
bt1 = new JButton("Open file");
bt2 = new JButton("Copy file");
tf1 = new JTextField(5);
add(bt1);
add(bt2);
add(tf1);
bt1.addActionListener(handler);
bt2.addActionListener(handler);
}
}
class eHandler implements ActionListener{
public void actionPerformed(ActionEvent e) {
if (e.getSource()==Main.bt1){
OpenFile op = new OpenFile();
op.fileOpen();
}
if (e.getSource()==Main.bt2){
Main.copyCount = Integer.parseInt(Main.tf1.getText());
Copy cop = new Copy();
cop.fileCopy();
}
}
}
//复制文件的过程:
public class OpenFile {
JFileChooser chooser1;
static File fileDat;
static String fileName, filePath, fileFullPathName;
public void fileOpen(){
try {
chooser1 = new JFileChooser();
chooser1.setCurrentDirectory(new File("."));
chooser1.setDialogTitle("Выберите файл");
chooser1.showOpenDialog(null);
fileDat = chooser1.getSelectedFile();
fileName = fileDat.getName();
filePath = fileDat.getParent();
fileFullPathName = fileDat.getAbsolutePath();
} catch (Exception e) {}
}
}
答案 0 :(得分:7)
您可能无法使用多个线程加快速度。复制文件将是“I / O绑定”,这意味着速度的限制因素是您可以多快地将字节写入设备。对于硬盘驱动器,这是一个串行操作;不同的线程不能同时执行,一个线程必须等到磁盘可以自由写入(在磁盘上的不同位置),因此至少没有速度提升。
事实上,这是一个经典案例,在尝试改进它时会让事情变得更糟。由于最长的操作可能是磁盘将其读/写磁头定位在写入所需的位置,因此将写入放在多个线程上可能会导致单个线程的更多操作,因为单个写入操作的时间较长磁盘驱动程序可以优化长度,使其比多个较短的操作更快。
如果您确定这只会用于固态驱动器,则适用不同的参数。但事情并没有因为它们处于不同的线程而变得更快。
-
编辑:我想您可以调查使用较大的缓冲区进行文件操作;有时会加快速度。