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

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

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

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

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

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

4、this关键字总结

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

  1. class Person {
  2. private String username;
  3. private String password;
  4. public Person() {
  5. System.out.println("Person construct.");
  6. }
  7. public Person(String username) {
  8. this();
  9. this.username = username;
  10. }
  11. public Person(String username, String password) {
  12. this(username);
  13. this.password = password;
  14. }
  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. public MyThread(String threadName) {
  4. super();
  5. this.threadName = threadName;
  6. }
  7. public void run() {
  8. for (int i = 0; i < 5; i++) {
  9. System.out.println(threadName);
  10. try {
  11. Thread.sleep(1000);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }
  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. public synchronized void run() {
  12. while (count > 0) {
  13. System.out.println(Thread.currentThread().getName() + ": " + count--);
  14. try {
  15. Thread.sleep(1);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }

或者:

  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. thread1.start();
  10. thread2.start();
  11. }
  12. }
  13. class MyThread implements Runnable {
  14. private static int count = 10;
  15. public synchronized void run() {
  16. while (count > 0) {
  17. System.out.println(Thread.currentThread().getName() + " sell : " + count--);
  18. try {
  19. Thread.sleep(1000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }

测试结果:

  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. Thread.sleep(1000);
  7. ticket.update();
  8. }
  9. }
  10. class Ticket implements Runnable {
  11. private /*static*/ int ticket = 100;
  12. synchronized public void run() {
  13. ticket = 1000;
  14. try {
  15. Thread.sleep(5000);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("ticket: " + ticket);
  20. }
  21. public void update() {
  22. ticket--;
  23. System.out.println(ticket);
  24. }
  25. }

测试结果:

  1. 999
  2. ticket: 999

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

本文转自 zhouhaipeng 51CTO博客,原文链接:http://blog.51cto.com/tianya23/695346,如需转载请自行联系原作者

Java基础知识回顾-6相关推荐

  1. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  2. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

  3. Java基础知识回顾之一 ----- 基本数据类型

    前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...

  4. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

  5. Java基础知识回顾之四 ----- 集合List、Map和Set

    前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...

  6. Java基础知识回顾之三 ----- 封装、继承和多态

    前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...

  7. Java基础知识回顾

    1.Java集合 (1).几种集合(List.Set和Map)的区别          JAVA中几种集合(List.Set和Map)的区别   java常用集合总结 Java集合类: Set.Lis ...

  8. java基础知识回顾之javaIO类总结

    java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...

  9. java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片

    package com.lp.ecjtu;import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  10. Java基础知识回顾--线程

    基本概念 线程是一个程序内部的顺序控制流 Java的线程是通过java.lang.Thread类来实现的.main函数是一个主线程,用户可以通过创建Thread的实例来创建新的线程.每一个线程都必须实 ...

最新文章

  1. linux上的用户管理
  2. 互联网协议 — RIP 路由信息协议
  3. 10分钟看懂, Java NIO 底层原理
  4. C++modular exponentiation模幂运算的实现算法(附完整源码)
  5. C++学习笔记之二:通过结构体来理解类
  6. bootstrap 点击按钮刷新_Spring Cloud 中的 Bootstrap 上下文
  7. Python查找列表中相加等于s的n个数字(combinations的使用)
  8. fanuc机器人编程手册_FANUC机器人示教编程:距离先执行指令功能介绍与使用方法
  9. 最全java面试题及答案(208道)
  10. 计算机电源高频干扰,开关电源中电磁干扰的透彻分析及其解决办法
  11. linux ansys内存不够,ANSYS 硬件配置建议
  12. steam怎么设置邮箱令牌_【教程】电脑端steam动态令牌设置教程
  13. 回车、换行、回车换行、硬回车以及软回车
  14. intel vPro LMS模块 Linux环境编译
  15. 阿拉尔市谷歌高清卫星地图下载
  16. 《计算机视觉》笔记(一)
  17. WebRTC系列 -- iOS ADM音频数据流处理流程及源码阅读记录
  18. 思考乐教育的荣耀与忧虑:整体增速放缓,异地扩张未见成效
  19. MVP Open Day手记——场上场下同样精彩
  20. java策略模式实战

热门文章

  1. O’Reilly软件架构大会第一天内容回顾
  2. 分析RAC下一个SPFILE整合的三篇文章的文件更改
  3. windows 安装 spark 及 pycharm 调试 TopN 实例
  4. 修复电脑右键没有新建记事本
  5. 更改IE的默认搜索引擎
  6. 在asp.net中读取XML文件信息的4种方法
  7. jdbc桥连接过程解析
  8. 13接口登记案例 把对象赋值给接口
  9. WebSocket API简介
  10. 简述RHEL7新特性(一)