1、遍历Jar/zip文件中的资源

  1. File jar = new File("myfile.jar"); 
  2. ZipInputStream zis = new ZipInputStream(new FileInputStream(jar)); 
  3.  
  4. try { 
  5.     for (ZipEntry entry = zis.getNextEntry(); entry != null; entry = zis.getNextEntry()) { 
  6.         // visit entry 
  7.     } 
  8. finally { 
  9.     zis.close(); 

2、遍历WEB应用中的资源。

Set<String> subResources = servletContext.getResourcePaths("/WEB-INF/");

3、自定义属性编辑器,date的格式化中常用

  1. public class MyPropertyEditor extends PropertyEditorSupport { 
  2.     String format = "yyyy-MM-dd"
  3.  
  4.     public void setFormat(String format) { 
  5.         this.format = format; 
  6.     } 
  7.  
  8.     @Override 
  9.     public void setAsText(String text) throws IllegalArgumentException { 
  10.         SimpleDateFormat dateFormat = new SimpleDateFormat(format); 
  11.         System.out.println("--->" + text); 
  12.         try { 
  13.             Date date = dateFormat.parse(text); 
  14.             this.setValue(date); 
  15.         } catch (ParseException e) { 
  16.             // TODO Auto-generated catch block  
  17.             e.printStackTrace(); 
  18.         } 
  19.     } 

4、this关键字总结

调用构造函数,且必须放在构造函数的第一行,且不能产生循环构造函数调用。

  1. class Person { 
  2.     private String username; 
  3.     private String password; 
  4.  
  5.     public Person() { 
  6.         System.out.println("Person construct."); 
  7.     } 
  8.     public Person(String username) { 
  9.         this(); 
  10.         this.username = username; 
  11.     } 
  12.     public Person(String username, String password) { 
  13.         this(username); 
  14.         this.password = password; 
  15.     } 

 this对象

  1. public void print(){ 
  2.       System.out.println(this); 
  3.   } 

 

  1. Person person = new Person("zhangsan","hello"); 
  2.        person.print(); 
  3.        System.out.println(person); 

 测试结果:属性的内容完全一致,具体如下。说明this代表的就是当前new出来的对象。new出来的是哪个对象this就代表这个对象。

  1. com.alibaba.hummock.designpattern.composite2.Person@1fb8ee3 
  2. com.alibaba.hummock.designpattern.composite2.Person@1fb8ee3 

5、输出系统属性到屏幕,不用再一个个的for循环输出

System.getProperties().list(System.out); 

 

6、Thread的join方法
join()将多线程交替执行的方式转换成了顺序执行,也就是等join的线程执行完成返回之后再往下推进主流程。
 
  1. class MyThread implements Runnable { 
  2.     private String threadName; 
  3.  
  4.     public MyThread(String threadName) { 
  5.         super(); 
  6.         this.threadName = threadName; 
  7.     } 
  8.  
  9.     public void run() { 
  10.         for (int i = 0; i < 5; i++) { 
  11.             System.out.println(threadName); 
  12.             try { 
  13.                 Thread.sleep(1000); 
  14.             } catch (InterruptedException e) { 
  15.                 e.printStackTrace(); 
  16.             } 
  17.         } 
  18.     } 
  19.  
 
  1. public class Junit { 
  2.     public static void main(String[] args) throws Exception { 
  3.         MyThread target1 = new MyThread("mt1"); 
  4.         Thread thread = new Thread(target1); 
  5.         thread.start(); 
  6.         thread.join(); 
  7.         for (int i = 0; i < 5; i++) { 
  8.             System.out.println(Thread.currentThread().getName()); 
  9.         } 
  10.  
  11.     } 
结果: 不再是main和MyThread 交替执行,而是MyThread执行完成后再执行main线程。
  1. mt1 
  2. mt1 
  3. mt1 
  4. mt1 
  5. mt1 
  6. main 
  7. main 
  8. main 
  9. main 
  10. main 
 
7、售票系统模拟 
  1. public class Junit { 
  2.     public static void main(String[] args) throws Exception { 
  3.         MyThread target1 = new MyThread(); 
  4.         MyThread target2 = new MyThread(); 
  5.         target1.start(); 
  6.         target2.start(); 
  7.     } 
  8.  
  9. class MyThread extends Thread { 
  10.     private static int count = 10
  11.  
  12.     public synchronized void run() { 
  13.             while (count > 0) { 
  14.                 System.out.println(Thread.currentThread().getName() + ": " + count--); 
  15.                 try { 
  16.                     Thread.sleep(1); 
  17.                 } catch (InterruptedException e) { 
  18.                     e.printStackTrace(); 
  19.                 } 
  20.         } 
  21.     } 
  22.  

或者:

  1. public class Junit { 
  2.     public static void main(String[] args) { 
  3.         MyThread target1 = new MyThread(); 
  4.         MyThread target2 = new MyThread(); 
  5.         Thread thread1 = new Thread(target1); 
  6.         Thread thread2 = new Thread(target2); 
  7.         thread1.setName("t1"); 
  8.         thread2.setName("t2"); 
  9.          
  10.         thread1.start(); 
  11.         thread2.start(); 
  12.     } 
  13.  
  14. class MyThread implements Runnable { 
  15.     private static int count = 10
  16.  
  17.     public synchronized void run() { 
  18.         while (count > 0) { 
  19.             System.out.println(Thread.currentThread().getName() + " sell : " + count--); 
  20.             try { 
  21.                 Thread.sleep(1000); 
  22.             } catch (InterruptedException e) { 
  23.                 e.printStackTrace(); 
  24.             } 
  25.         } 
  26.     } 

 

 测试结果:

  1. Thread-0: 10 
  2. Thread-1: 9 
  3. Thread-1: 8 
  4. Thread-0: 7 
  5. Thread-0: 6 
  6. Thread-1: 5 
  7. Thread-0: 4 
  8. Thread-1: 3 
  9. Thread-1: 2 
  10. Thread-0: 1 

【注意】

第一:线程之间共享的变量必须是成员变量,而不是方法中的变量,且必须属于线程的,即必须为static变量

第二:线程之间必须同步,即synchronized

18、多线程中线程安全问题

在程序中,成员变量是可以被多个成员方法操作(读或写),即便该变量存在加锁(synchronized)的方法中在多线程的情况下也可以被其他线程调用其他方法修改,这也就是成员变量不是线程安全的根本原因。servlet为线程不安全性即为最好例子。如果要使用成员变量,又要保证线程安全性,那该成员变量在其他方法中必须为只读,不能修改该变量。

  1. public class Junit { 
  2.     public static void main(String[] args) throws Exception { 
  3.         Ticket ticket = new Ticket(); 
  4.         new Thread(ticket).start(); 
  5.          
  6.         //保证线程已经被启动 
  7.         Thread.sleep(1000); 
  8.          
  9.         ticket.update(); 
  10.     } 
  11.  
  12. class Ticket implements Runnable { 
  13.     private /*static*/ int ticket = 100
  14.  
  15.     synchronized public void run() { 
  16.         ticket = 1000
  17.         try { 
  18.             Thread.sleep(5000); 
  19.         } catch (InterruptedException e) { 
  20.             e.printStackTrace(); 
  21.         } 
  22.  
  23.         System.out.println("ticket: " + ticket); 
  24.     } 
  25.  
  26.     public void update() { 
  27.         ticket--; 
  28.         System.out.println(ticket); 
  29.     } 

测试结果:

  1. 999 
  2. ticket: 999 

【注意】如果同一个类中有多个方法都使用了synchronized关键字,就要分析他们获取的是哪个对象的锁。如果是同一把锁,则只能被一个线程获取;否则可并行执行。