记录一下单线程与多线程处理性能的比较
1、单线程
1 import java.util.LinkedList; 2 3 public class TrainBooking2 { 4 5 public static void main(String[] args) { 6 long startTime = System.currentTimeMillis(); 7 LinkedList<Integer> tickets = new LinkedList<Integer>(); 8 for (int i = 0; i < 100; i++) { 9 tickets.add(i); 10 } 11 new ABook(tickets, startTime).start(); 12 13 } 14 } 15 16 17 class ABook extends Thread { 18 private LinkedList<Integer> m_tickets; 19 private long m_startTime; 20 21 public ABook(LinkedList<Integer> tickets, long startTime) { 22 m_startTime = startTime; 23 m_tickets = tickets; 24 } 25 26 public void run() { 27 while (true) { 28 if (!booking(m_tickets)) { 29 System.out.println("售票共用时:" + (System.currentTimeMillis() - m_startTime) / 1000 + "秒"); 30 break; 31 } 32 } 33 } 34 35 private boolean booking(LinkedList<Integer> totalTickets) { 36 try { 37 Thread.sleep(200); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 synchronized (totalTickets) { 42 if (totalTickets.size() > 0) { 43 totalTickets.removeLast(); 44 System.out.println("线程id" + Thread.currentThread().getId() + "售票一张,剩余电影票" + totalTickets.size() + "张"); 45 return true; 46 } else { 47 System.out.println("线程id" + Thread.currentThread().getId() + "显示票已售完"); 48 return false; 49 } 50 } 51 } 52 }
输出:
线程id11售票一张,剩余电影票99张
线程id11售票一张,剩余电影票98张
线程id11售票一张,剩余电影票97张
线程id11售票一张,剩余电影票96张
线程id11售票一张,剩余电影票95张
线程id11售票一张,剩余电影票94张
线程id11售票一张,剩余电影票93张
线程id11售票一张,剩余电影票92张
线程id11售票一张,剩余电影票91张
线程id11售票一张,剩余电影票90张
线程id11售票一张,剩余电影票89张
线程id11售票一张,剩余电影票88张
线程id11售票一张,剩余电影票87张
线程id11售票一张,剩余电影票86张
线程id11售票一张,剩余电影票85张
线程id11售票一张,剩余电影票84张
线程id11售票一张,剩余电影票83张
线程id11售票一张,剩余电影票82张
线程id11售票一张,剩余电影票81张
线程id11售票一张,剩余电影票80张
线程id11售票一张,剩余电影票79张
线程id11售票一张,剩余电影票78张
线程id11售票一张,剩余电影票77张
线程id11售票一张,剩余电影票76张
线程id11售票一张,剩余电影票75张
线程id11售票一张,剩余电影票74张
线程id11售票一张,剩余电影票73张
线程id11售票一张,剩余电影票72张
线程id11售票一张,剩余电影票71张
线程id11售票一张,剩余电影票70张
线程id11售票一张,剩余电影票69张
线程id11售票一张,剩余电影票68张
线程id11售票一张,剩余电影票67张
线程id11售票一张,剩余电影票66张
线程id11售票一张,剩余电影票65张
线程id11售票一张,剩余电影票64张
线程id11售票一张,剩余电影票63张
线程id11售票一张,剩余电影票62张
线程id11售票一张,剩余电影票61张
线程id11售票一张,剩余电影票60张
线程id11售票一张,剩余电影票59张
线程id11售票一张,剩余电影票58张
线程id11售票一张,剩余电影票57张
线程id11售票一张,剩余电影票56张
线程id11售票一张,剩余电影票55张
线程id11售票一张,剩余电影票54张
线程id11售票一张,剩余电影票53张
线程id11售票一张,剩余电影票52张
线程id11售票一张,剩余电影票51张
线程id11售票一张,剩余电影票50张
线程id11售票一张,剩余电影票49张
线程id11售票一张,剩余电影票48张
线程id11售票一张,剩余电影票47张
线程id11售票一张,剩余电影票46张
线程id11售票一张,剩余电影票45张
线程id11售票一张,剩余电影票44张
线程id11售票一张,剩余电影票43张
线程id11售票一张,剩余电影票42张
线程id11售票一张,剩余电影票41张
线程id11售票一张,剩余电影票40张
线程id11售票一张,剩余电影票39张
线程id11售票一张,剩余电影票38张
线程id11售票一张,剩余电影票37张
线程id11售票一张,剩余电影票36张
线程id11售票一张,剩余电影票35张
线程id11售票一张,剩余电影票34张
线程id11售票一张,剩余电影票33张
线程id11售票一张,剩余电影票32张
线程id11售票一张,剩余电影票31张
线程id11售票一张,剩余电影票30张
线程id11售票一张,剩余电影票29张
线程id11售票一张,剩余电影票28张
线程id11售票一张,剩余电影票27张
线程id11售票一张,剩余电影票26张
线程id11售票一张,剩余电影票25张
线程id11售票一张,剩余电影票24张
线程id11售票一张,剩余电影票23张
线程id11售票一张,剩余电影票22张
线程id11售票一张,剩余电影票21张
线程id11售票一张,剩余电影票20张
线程id11售票一张,剩余电影票19张
线程id11售票一张,剩余电影票18张
线程id11售票一张,剩余电影票17张
线程id11售票一张,剩余电影票16张
线程id11售票一张,剩余电影票15张
线程id11售票一张,剩余电影票14张
线程id11售票一张,剩余电影票13张
线程id11售票一张,剩余电影票12张
线程id11售票一张,剩余电影票11张
线程id11售票一张,剩余电影票10张
线程id11售票一张,剩余电影票9张
线程id11售票一张,剩余电影票8张
线程id11售票一张,剩余电影票7张
线程id11售票一张,剩余电影票6张
线程id11售票一张,剩余电影票5张
线程id11售票一张,剩余电影票4张
线程id11售票一张,剩余电影票3张
线程id11售票一张,剩余电影票2张
线程id11售票一张,剩余电影票1张
线程id11售票一张,剩余电影票0张
线程id11显示票已售完
售票共用时:20秒
2、多线程:
1 import java.util.LinkedList; 2 3 public class TrainBooking2 { 4 5 public static void main(String[] args) { 6 long startTime = System.currentTimeMillis(); 7 LinkedList<Integer> tickets = new LinkedList<Integer>(); 8 for (int i = 0; i < 100; i++) { 9 tickets.add(i); 10 } 11 12 new ABook(tickets, startTime).start(); 13 new ABook(tickets, startTime).start(); 14 new ABook(tickets, startTime).start(); 15 16 } 17 } 18 19 20 class ABook extends Thread { 21 private LinkedList<Integer> m_tickets; 22 private long m_startTime; 23 24 public ABook(LinkedList<Integer> tickets, long startTime) { 25 m_startTime = startTime; 26 m_tickets = tickets; 27 } 28 29 public void run() { 30 while (true) { 31 if (!booking(m_tickets)) { 32 System.out.println("售票共用时:" + (System.currentTimeMillis() - m_startTime) / 1000 + "秒"); 33 break; 34 } 35 } 36 } 37 38 private boolean booking(LinkedList<Integer> totalTickets) { 39 try { 40 Thread.sleep(200); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 synchronized (totalTickets) { 45 if (totalTickets.size() > 0) { 46 totalTickets.removeLast(); 47 System.out.println("线程id" + Thread.currentThread().getId() + "售票一张,剩余电影票" + totalTickets.size() + "张"); 48 return true; 49 } else { 50 System.out.println("线程id" + Thread.currentThread().getId() + "显示票已售完"); 51 return false; 52 } 53 } 54 } 55 }
输出:
线程id11售票一张,剩余电影票99张
线程id13售票一张,剩余电影票98张
线程id12售票一张,剩余电影票97张
线程id12售票一张,剩余电影票96张
线程id11售票一张,剩余电影票95张
线程id13售票一张,剩余电影票94张
线程id11售票一张,剩余电影票93张
线程id12售票一张,剩余电影票92张
线程id13售票一张,剩余电影票91张
线程id11售票一张,剩余电影票90张
线程id12售票一张,剩余电影票89张
线程id13售票一张,剩余电影票88张
线程id11售票一张,剩余电影票87张
线程id12售票一张,剩余电影票86张
线程id13售票一张,剩余电影票85张
线程id11售票一张,剩余电影票84张
线程id12售票一张,剩余电影票83张
线程id13售票一张,剩余电影票82张
线程id12售票一张,剩余电影票81张
线程id13售票一张,剩余电影票80张
线程id11售票一张,剩余电影票79张
线程id13售票一张,剩余电影票78张
线程id11售票一张,剩余电影票77张
线程id12售票一张,剩余电影票76张
线程id13售票一张,剩余电影票75张
线程id11售票一张,剩余电影票74张
线程id12售票一张,剩余电影票73张
线程id12售票一张,剩余电影票72张
线程id13售票一张,剩余电影票71张
线程id11售票一张,剩余电影票70张
线程id11售票一张,剩余电影票69张
线程id13售票一张,剩余电影票68张
线程id12售票一张,剩余电影票67张
线程id11售票一张,剩余电影票66张
线程id13售票一张,剩余电影票65张
线程id12售票一张,剩余电影票64张
线程id11售票一张,剩余电影票63张
线程id12售票一张,剩余电影票62张
线程id13售票一张,剩余电影票61张
线程id12售票一张,剩余电影票60张
线程id11售票一张,剩余电影票59张
线程id13售票一张,剩余电影票58张
线程id12售票一张,剩余电影票57张
线程id13售票一张,剩余电影票56张
线程id11售票一张,剩余电影票55张
线程id11售票一张,剩余电影票54张
线程id13售票一张,剩余电影票53张
线程id12售票一张,剩余电影票52张
线程id13售票一张,剩余电影票51张
线程id12售票一张,剩余电影票50张
线程id11售票一张,剩余电影票49张
线程id13售票一张,剩余电影票48张
线程id11售票一张,剩余电影票47张
线程id12售票一张,剩余电影票46张
线程id13售票一张,剩余电影票45张
线程id12售票一张,剩余电影票44张
线程id11售票一张,剩余电影票43张
线程id13售票一张,剩余电影票42张
线程id12售票一张,剩余电影票41张
线程id11售票一张,剩余电影票40张
线程id13售票一张,剩余电影票39张
线程id12售票一张,剩余电影票38张
线程id11售票一张,剩余电影票37张
线程id13售票一张,剩余电影票36张
线程id11售票一张,剩余电影票35张
线程id12售票一张,剩余电影票34张
线程id13售票一张,剩余电影票33张
线程id12售票一张,剩余电影票32张
线程id11售票一张,剩余电影票31张
线程id13售票一张,剩余电影票30张
线程id11售票一张,剩余电影票29张
线程id12售票一张,剩余电影票28张
线程id13售票一张,剩余电影票27张
线程id11售票一张,剩余电影票26张
线程id12售票一张,剩余电影票25张
线程id13售票一张,剩余电影票24张
线程id12售票一张,剩余电影票23张
线程id11售票一张,剩余电影票22张
线程id13售票一张,剩余电影票21张
线程id11售票一张,剩余电影票20张
线程id12售票一张,剩余电影票19张
线程id13售票一张,剩余电影票18张
线程id12售票一张,剩余电影票17张
线程id11售票一张,剩余电影票16张
线程id13售票一张,剩余电影票15张
线程id11售票一张,剩余电影票14张
线程id12售票一张,剩余电影票13张
线程id13售票一张,剩余电影票12张
线程id11售票一张,剩余电影票11张
线程id12售票一张,剩余电影票10张
线程id13售票一张,剩余电影票9张
线程id11售票一张,剩余电影票8张
线程id12售票一张,剩余电影票7张
线程id13售票一张,剩余电影票6张
线程id11售票一张,剩余电影票5张
线程id12售票一张,剩余电影票4张
线程id13售票一张,剩余电影票3张
线程id12售票一张,剩余电影票2张
线程id11售票一张,剩余电影票1张
线程id13售票一张,剩余电影票0张
线程id12显示票已售完
售票共用时:6秒
线程id11显示票已售完
售票共用时:6秒
线程id13显示票已售完
售票共用时:7秒
显示多线程与单线程相比,性能占优,但由于CPU分片问题,所以线程不可能无限增加。