Java笔记整理第二文之161013期

3,900次阅读
6 条评论

共计 4447 个字符,预计需要花费 12 分钟才能阅读完成。

前言

Java 笔记整理上一次已经是三周之前了,在这三周内(除去国庆实际只有两周)又学习了很多的新知识,今天来整理一下笔记,顺带梳理思路 Java 笔记整理第二文之 161013 期

正文

异常

抛出处理(throw,throws):

  • throw:用于方法内部,作用是在方法内部抛出一个异常对象且只能跟一个异常对象。
  • throws:用于方法声明上,作用是在方法声明上声明抛出异常类型并可以跟多个异常对象。

异常处理:

try{// 可能发生异常的代码}catch(捕获的异常类型 变量名){// 处理异常的代码}finall{// 一定会执行的代码(除 JVM 停止),多用于释放资源}

异常分类:

  • 运行时异常:RuntimeException 以及 RuntimeException 的子类都是属于运行时异常。
  • 除了运行时异常就是编译异常。

异常分类:

  • 运行时异常:RuntimeException 以及 RuntimeException 的子类都是属于运行时异常。
  • 除了运行时异常就是编译异常。

Package

  • 被访问的包中的类权限必须是 public 的。
  • 类中的成员权限:public 或者 protected
  • protected 是为其他包中的子类提供的一种权限

包的 4 种权限图解:

Java 笔记整理第二文之 161013 期

javac -d . PackageDemo.java // 编译 d:创建目录 .:在当前目录创建
java cn.java.demo1.PackageDemo // 运行 

多线程

创建方式一:继承 Thread 类

  1. 子类覆盖父类中的 run 方法,将线程运行
    的代码存放在 run 中。
  2. 建立子类对象的同时线程也被创建。
  3. 通过调用 start 方法开启线程。

注意:多次调用 start()会报异常。

创建方式二:实现 Runnable 接口

  1. 实现类覆盖接口中的 run 方法。
  2. 通过 Thread 类创建线程,并将实现了
    Runnable 接口的子类对象作为参数传递给
    Thread 类的构造函数。
  3. Thread 类对象调用 start 方法开启线程。

Thread 和 Runnable 的关系

  1. Thread 是 Runnable 的子类。
  2. 实际上 Thread 和 Runable 的关系和代理设计模式很像,这里的 Thread 就是代理类。我们自己所实现的类才是真正的。

Thread 和 Runnable 的区别

  • Runnable 可以共享数据

同步:synchronized

synchronized(对象)
{// 需要同步的代码}

同步的前提:

  • 同步需要两个或者两个以上的线程。
  • 多个线程使用的是同一个锁。

同步的弊端:

  • 当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。

常用方法:

  • wait():使当前线程进入堵塞状态等待(特点:释放 cpu 执行权,释放锁)。
  • notify():唤醒一个标识所属的同步的锁的线程
  • notifyAll():唤醒所有标识所属的同步的锁的线程

同步函数

  • 在函数上加上 synchronized 修饰符即可。
  • 同步函数的锁是 this,而同步代码块的锁可以是任意对象。
  • 静态同步函数的锁是本类的字节码对象。
public synchronized void fun(){// 同步的代码}

注意:同步应用过多就有可能会出现死锁,导致线程出现无限期地僵持下去的局面。

锁:Lock

在多线程编程里面一个重要的概念是锁定,如果一个资源是多个线程共享的,为了保证数据的完整性,在进行事务性操作时需要将共享资源锁定,这样可以保证在做事务性操作时只有一个线程能对资源进行操作,从而保证数据的完整性。

  • lock.lock():取得锁
  • lock.unlock():释放锁

Condition

Condition:监视器,常与 Lock 一起使用,可以让不同的共享线程有不同的监视器,从而实现线程之间的相互配合。

Condition c = lock.newCondition();
  • await():造成当前线程在接到信号或被中断之前一直处于等待状态。
  • signal():唤醒一个等待线程。
  • signalAll():唤醒所有等待线程。

SimpleDateFormat

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

public class DateDemo {public static void main(String[] args) {Date date = new Date();
			SimpleDateFormat simpDate = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS 毫秒");
			String d = simpDate.format(date);
			Date p = null;
			try {p = simpDate.parse("2016 年 02 月 06 日 05 时 59 分 53 秒 222 毫秒");
			} catch (ParseException e1) {e1.printStackTrace();
			}
			System.out.println(d);
			System.out.println(p);
	}
}
/*
	Run result:2016 年 10 月 13 日 14 时 59 分 07 秒 605 毫秒
		Sat Feb 06 05:59:53 CST 2016
*/

Runtime

每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。

public class RunTimeDemo {public static void main(String[] args) throws IOException, InterruptedException {Runtime runt = Runtime.getRuntime();	// 获取 runtime 的 instance
		Process p = runt.exec("C:\\Windows\\notepad.exe");	// 启动记事本
		Thread.sleep(3000);	// 睡眠 3 秒
		p.destroy();	// 杀死当前的进程}
}

DecimalFormat

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

public class DecimalFormatDemo {public static void main(String[] args) {MyDecimalFormat.format("###,###,###$", 10252155.33);
		MyDecimalFormat.format("###,###%",25542);// 百分之
		MyDecimalFormat.format("###,###\u2030",56200);// 千分之
	}
}

class MyDecimalFormat{public static void format(String format,double values){DecimalFormat df = new DecimalFormat(format);
		String str = df.format(values);
		System.out.println("原数值:["+values+"] 格式化后为:["+str+"]");
	}
}

BigInteger

不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

import java.math.BigInteger;
public class BigIntegerDemo {public static void main(String[] args) {BigInteger b1 = new BigInteger("1212114646545646545646546");
		BigInteger b2 = new BigInteger("448486164564646546");
		BigInteger[] resultArr = b1.divideAndRemainder(b2);
		System.out.println("整数部位:"+resultArr[0]+"\n 小数部位:"+resultArr[1]);
		System.out.println("加法:"+b1.add(b2));
	}
}

clone()

创建并返回此对象的一个副本。

public class Democlone {public static void main(String[] args) {CloneDemo s = new CloneDemo("张三");
		CloneDemo d = null;
		try {d = (CloneDemo)s.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();
		}
		d.print();}
}

class CloneDemo implements Cloneable{
	private String name;

	public CloneDemo(String name) {this.name = name;}
	
	public Object clone() throws CloneNotSupportedException{return super.clone();
	}
	
	public void print(){System.out.println("Name 为:"+this.name);
	}
	
}

Timer

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskDemo {public static void main(String[] args) {Timer t = new Timer();	// 建立 Timer 实例
		TimerTasks ts = new TimerTasks(); // 建立任务实例
		t.schedule(ts, 1000,1000);
	}
}

class TimerTasks extends TimerTask{public void run(){SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date nowDate = new Date();
		System.out.println(sd.format(nowDate));
	}
}
正文完
使用官方微信小程序体验更多功能
post-qrcode
 6
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 2016-10-13发表,共计4447字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(6 条评论)
232 评论达人 LV.1
2016-10-14 18:31:05 回复

签到成功!签到时间:2016-10-14 18:05:00,每日打卡,生活更精彩哦~

 Windows  Firefox  中国四川省成都市电信
免费SSL 评论达人 LV.1
2016-10-14 09:33:27 回复

朋友,交换链接吗?

 Windows  Chrome  中国江苏省苏州市电信
李光春 评论达人 LV.1
2016-10-13 20:19:56 回复

最近我也在学这个

 Windows  Chrome  中国广东省广州市电信