1.模拟QQ相册上传图片(上传指定文件夹下所有的图片)
多线程上传(每个图片开辟一个子线程)
package cn.demo01; import java.io.*; public class Demo02 { public static void main(String[] args) { File imgPath = new File("C:\Users\hp\Desktop\tupian1"); File toImgPath = new File("C:\Users\hp\Desktop\demo3"); // CopyTimeThread timeThread = new CopyTimeThread(); // timeThread.setFile1(imgPath); // timeThread.setFile2(toImgPath); // timeThread.start(); File[] imgs = imgPath.listFiles();//获取了指定目录下的所有的图片文件 //遍历图片文件,循环一个上传一个 for (int i = 0; i < imgs.length; i++) { //创建子线程对象 CopyImgThread t = new CopyImgThread(); t.setImgFile(imgs[i]);//设置本线程要复制的图片对象 t.setFile2(toImgPath);//目标文件夹 t.start();//启动子线程(子线程是独立的流程) } } } class CopyImgThread extends Thread{ private File imgFile;//要复制的图片文件对象 private File file2;//要粘贴到哪个目录中 @Override public void run() { try { FileInputStream in = new FileInputStream(imgFile); File img = new File(file2, imgFile.getName());//拼接目标目录和文件名称 FileOutputStream out = new FileOutputStream(img); int len = 0; byte[]bytes=new byte[10];//相当于缓存空间 while((len=in.read(bytes))!=-1){ out.write(bytes,0,len);//读len个,就写len个 } out.close(); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public File getImgFile() { return imgFile; } public void setImgFile(File imgFile) { this.imgFile = imgFile; } public File getFile2() { return file2; } public void setFile2(File file2) { this.file2 = file2; } } public class Ticket { private Integer ticketNum; //票号 private String trainNum; //车次 private String Origin; //始发地 private String destination; //目的地 @Override public String toString() { return "票号:" + ticketNum + ", 车次:" + trainNum + ", 班次:" + Origin + " ---> " + destination; } public Ticket() { } public Ticket(Integer ticketNum, String trainNum, String origin, String destination) { this.ticketNum = ticketNum; this.trainNum = trainNum; Origin = origin; this.destination = destination; } public Integer getTicketNum() { return ticketNum; } public void setTicketNum(Integer ticketNum) { this.ticketNum = ticketNum; } public String getTrainNum() { return trainNum; } public void setTrainNum(String trainNum) { this.trainNum = trainNum; } public String getOrigin() { return Origin; } public void setOrigin(String origin) { Origin = origin; } public String getDestination() { return destination; } public void setDestination(String destination) { this.destination = destination; } }Ticketer子线程类(售票员)
package cn.demo02; import java.util.List; public class Ticketer extends Thread{ private List测试类Test中创建两个子线程进行卖票tickets; //票库(多个售票员同一个票库) //卖票方法(从集合中删除一张票) public void sellingTickets(){ //从票库删除一张票 Ticket ticket = this.tickets.remove(0); System.out.println(this.getName()+"卖了一张:"+ticket); } @Override public void run() { //实现多线程卖票,“卖完为止” while(true){ //同一CPU时刻,只有一个线程能拿到锁 synchronized (this.tickets){ //如果剩余有票,则调用卖票方法 if(this.tickets.size()>0){ sellingTickets();//调用卖票的方法 }else{ //否则,票已售完 System.out.println(this.getName()+":票已售罄"); break; } } } } public List getTickets() { return tickets; } public void setTickets(List tickets) { this.tickets = tickets; } }
package cn.demo02; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { //票库 List运行效果tickets = new ArrayList<>(); for (int i = 1; i <= 20 ; i++) { Ticket ticket = new Ticket(i,"G2022","郑州","重庆"); tickets.add(ticket); } Ticketer t1 = new Ticketer(); t1.setName("小李"); Ticketer t2 = new Ticketer(); t2.setName("小范"); //给两个售票员设置同一个票库 t1.setTickets(tickets); t2.setTickets(tickets); //开始子线程进行售票 t1.start(); t2.start(); } }
小范卖了一张:票号:1, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:2, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:3, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:4, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:5, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:6, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:7, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:8, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:9, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:10, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:11, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:12, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:13, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:14, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:15, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:16, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:17, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:18, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:19, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:20, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:21, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:22, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:23, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:24, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:25, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:26, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:27, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:28, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:29, 车次:G2022, 班次:驻马店 ---> 上海 小杨卖了一张:票号:30, 车次:G2022, 班次:驻马店 ---> 上海 小杨:票已售完 小李:票已售完 小范:票已售完 Process finished with exit code 0