Java基础知识回顾-6
1、遍历Jar/zip文件中的资源
- File jar = new File("myfile.jar");
- ZipInputStream zis = new ZipInputStream(new FileInputStream(jar));
- try {
- for (ZipEntry entry = zis.getNextEntry(); entry != null; entry = zis.getNextEntry()) {
- // visit entry
- }
- } finally {
- zis.close();
- }
2、遍历WEB应用中的资源。
Set<String> subResources = servletContext.getResourcePaths("/WEB-INF/");
3、自定义属性编辑器,date的格式化中常用
- public class MyPropertyEditor extends PropertyEditorSupport {
- String format = "yyyy-MM-dd";
- public void setFormat(String format) {
- this.format = format;
- }
- @Override
- public void setAsText(String text) throws IllegalArgumentException {
- SimpleDateFormat dateFormat = new SimpleDateFormat(format);
- System.out.println("--->" + text);
- try {
- Date date = dateFormat.parse(text);
- this.setValue(date);
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
4、this关键字总结
调用构造函数,且必须放在构造函数的第一行,且不能产生循环构造函数调用。
- class Person {
- private String username;
- private String password;
- public Person() {
- System.out.println("Person construct.");
- }
- public Person(String username) {
- this();
- this.username = username;
- }
- public Person(String username, String password) {
- this(username);
- this.password = password;
- }
- }
this对象
- public void print(){
- System.out.println(this);
- }
- Person person = new Person("zhangsan","hello");
- person.print();
- System.out.println(person);
测试结果:属性的内容完全一致,具体如下。说明this代表的就是当前new出来的对象。new出来的是哪个对象this就代表这个对象。
- com.alibaba.hummock.designpattern.composite2.Person@1fb8ee3
- com.alibaba.hummock.designpattern.composite2.Person@1fb8ee3
5、输出系统属性到屏幕,不用再一个个的for循环输出
System.getProperties().list(System.out);
- class MyThread implements Runnable {
- private String threadName;
- public MyThread(String threadName) {
- super();
- this.threadName = threadName;
- }
- public void run() {
- for (int i = 0; i < 5; i++) {
- System.out.println(threadName);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- public class Junit {
- public static void main(String[] args) throws Exception {
- MyThread target1 = new MyThread("mt1");
- Thread thread = new Thread(target1);
- thread.start();
- thread.join();
- for (int i = 0; i < 5; i++) {
- System.out.println(Thread.currentThread().getName());
- }
- }
- }
- mt1
- mt1
- mt1
- mt1
- mt1
- main
- main
- main
- main
- main
- public class Junit {
- public static void main(String[] args) throws Exception {
- MyThread target1 = new MyThread();
- MyThread target2 = new MyThread();
- target1.start();
- target2.start();
- }
- }
- class MyThread extends Thread {
- private static int count = 10;
- public synchronized void run() {
- while (count > 0) {
- System.out.println(Thread.currentThread().getName() + ": " + count--);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
或者:
- public class Junit {
- public static void main(String[] args) {
- MyThread target1 = new MyThread();
- MyThread target2 = new MyThread();
- Thread thread1 = new Thread(target1);
- Thread thread2 = new Thread(target2);
- thread1.setName("t1");
- thread2.setName("t2");
- thread1.start();
- thread2.start();
- }
- }
- class MyThread implements Runnable {
- private static int count = 10;
- public synchronized void run() {
- while (count > 0) {
- System.out.println(Thread.currentThread().getName() + " sell : " + count--);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
测试结果:
- Thread-0: 10
- Thread-1: 9
- Thread-1: 8
- Thread-0: 7
- Thread-0: 6
- Thread-1: 5
- Thread-0: 4
- Thread-1: 3
- Thread-1: 2
- Thread-0: 1
【注意】
第一:线程之间共享的变量必须是成员变量,而不是方法中的变量,且必须属于线程的,即必须为static变量
第二:线程之间必须同步,即synchronized
18、多线程中线程安全问题
在程序中,成员变量是可以被多个成员方法操作(读或写),即便该变量存在加锁(synchronized)的方法中,在多线程的情况下也可以被其他线程调用其他方法修改,这也就是成员变量不是线程安全的根本原因。servlet为线程不安全性即为最好例子。如果要使用成员变量,又要保证线程安全性,那该成员变量在其他方法中必须为只读,不能修改该变量。
- public class Junit {
- public static void main(String[] args) throws Exception {
- Ticket ticket = new Ticket();
- new Thread(ticket).start();
- //保证线程已经被启动
- Thread.sleep(1000);
- ticket.update();
- }
- }
- class Ticket implements Runnable {
- private /*static*/ int ticket = 100;
- synchronized public void run() {
- ticket = 1000;
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("ticket: " + ticket);
- }
- public void update() {
- ticket--;
- System.out.println(ticket);
- }
- }
测试结果:
- 999
- ticket: 999
【注意】如果同一个类中有多个方法都使用了synchronized关键字,就要分析他们获取的是哪个对象的锁。如果是同一把锁,则只能被一个线程获取;否则可并行执行。
本文转自 zhouhaipeng 51CTO博客,原文链接:http://blog.51cto.com/tianya23/695346,如需转载请自行联系原作者
Java基础知识回顾-6相关推荐
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- 【Java基础知识回顾篇】之打怪升级Day001
Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...
- Java基础知识回顾之一 ----- 基本数据类型
前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...
- Java基础知识回顾之六 ----- IO流
前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...
- Java基础知识回顾之四 ----- 集合List、Map和Set
前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...
- Java基础知识回顾之三 ----- 封装、继承和多态
前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...
- Java基础知识回顾
1.Java集合 (1).几种集合(List.Set和Map)的区别 JAVA中几种集合(List.Set和Map)的区别 java常用集合总结 Java集合类: Set.Lis ...
- java基础知识回顾之javaIO类总结
java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...
- java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
package com.lp.ecjtu;import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java基础知识回顾--线程
基本概念 线程是一个程序内部的顺序控制流 Java的线程是通过java.lang.Thread类来实现的.main函数是一个主线程,用户可以通过创建Thread的实例来创建新的线程.每一个线程都必须实 ...
最新文章
- linux上的用户管理
- 互联网协议 — RIP 路由信息协议
- 10分钟看懂, Java NIO 底层原理
- C++modular exponentiation模幂运算的实现算法(附完整源码)
- C++学习笔记之二:通过结构体来理解类
- bootstrap 点击按钮刷新_Spring Cloud 中的 Bootstrap 上下文
- Python查找列表中相加等于s的n个数字(combinations的使用)
- fanuc机器人编程手册_FANUC机器人示教编程:距离先执行指令功能介绍与使用方法
- 最全java面试题及答案(208道)
- 计算机电源高频干扰,开关电源中电磁干扰的透彻分析及其解决办法
- linux ansys内存不够,ANSYS 硬件配置建议
- steam怎么设置邮箱令牌_【教程】电脑端steam动态令牌设置教程
- 回车、换行、回车换行、硬回车以及软回车
- intel vPro LMS模块 Linux环境编译
- 阿拉尔市谷歌高清卫星地图下载
- 《计算机视觉》笔记(一)
- WebRTC系列 -- iOS ADM音频数据流处理流程及源码阅读记录
- 思考乐教育的荣耀与忧虑:整体增速放缓,异地扩张未见成效
- MVP Open Day手记——场上场下同样精彩
- java策略模式实战