分别使用单线程、十个线程和多线程把一个文件夹下的一百张图片复制到另一个文件夹下,比较它们的处理时间 使用单线程:
package lesson19; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; public class MovieStone { public static void main(String[] args) { long begin=new Date().getTime(); InputStream in=null; OutputStream out=null; File dir=new File("D:\\export"); File[] listFiles = dir.listFiles(); for(int i=0;i<listFiles.length;i++) { try { in=new FileInputStream(listFiles[i]); out=new FileOutputStream("D:\\新地方\\"+listFiles[i].getName()); byte[] b=new byte[1024]; int len=0; while((len=in.read(b))!=-1) { out.write(b,0,len); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } long end=new Date().getTime(); System.out.println(end-begin); } }所用的时间: 十个线程:
package lesson20190519; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; public class Move10Thread { public static void main(String[] args) { long begin=new Date().getTime(); File dir=new File("D:\\export"); File[] listFiles = dir.listFiles(); for(int j=1;j<=10;j++) { final int s=j; new Thread() { public void run() { for(int i=(s-1)*10;i<s*10;i++) { InputStream in=null; OutputStream out=null; try { in=new FileInputStream(listFiles[i]); out=new FileOutputStream("D:\\还是那个地方\\"+listFiles[i].getName()); byte[] b=new byte[1024]; int len=0; while((len=in.read(b))!=-1) { out.write(b,0,len); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }.start(); } long end=new Date().getTime(); System.out.println(end-begin); } }使用时间:
一百个线程:
package lesson19; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; public class TheadMoveStone { public static void main(String[] args) { long begin=new Date().getTime(); File dir=new File("D:\\export"); File[] listFiles = dir.listFiles(); for(int i=0;i<listFiles.length;i++) { final File file=listFiles[i]; new Thread() { public void run() { InputStream in=null; OutputStream out=null; try { in=new FileInputStream(file); out=new FileOutputStream("D:\\老地方\\"+file.getName()); byte[] b=new byte[1024]; int len=0; while((len=in.read(b))!=-1) { out.write(b); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } long end=new Date().getTime(); System.out.println(end-begin); } }多线程用时: 可见使用多线程效率要比单线程高出很多,多线程不稳定,处理速度的最终决定因素是CPU、内存等,在单CPU(无论多少核)上,分配CPU资源的单位是“进程”而不是“线程”。