黑马程序员___Java基础[06-包和多线程]
一、package
1、定义包
使用package关键字在类的第一条语句定义包名
包名必须全部小写,一般用域名
2、编译带包的类
javac -d <目录> 源文件名.java
例如: javac -d . Person.java 编译到当前目录
3、默认包
如果一个类没有加上package关键字定义包名,它是在一个默认的包中
以前我们使用的类都没有定义包, 默认都在同一个包中, 互相直接可以直接访问
如果两个类定义了包, 并且是相同的包, 也可以直接访问
4、运行带包的类
java 包名.类名(全限定名)
例如: java cn.itcast.PackageDemo
5、访问权限
private 私有, 只有当前类可用;类是不能私有的。
默认, 同包中的类可用;类默认也是只能同包内使用。
protected 保护, 同包中的类和子类可用;类不能使用这个修饰符。
public 公有,所有的类都可用。如果一个类希望被其他包中的类使用,那么必须使用public修饰,public的类必须和文件名一致。
6、导入其他包中的类
首先要使用的类必须是public修饰的
使用import关键字可以导入其他包中的类
a、星号方式导入:导入指定包中所有的类(让指定包中所有的类对本类可见)。
如果当前包中有同名的类,优先使用当前包中的。
b、类名方式导入:导入指定包中指定的类,无论当前包中是否有需要的类,都使用导入的包中的类。
如果一个类中要是用两个包中同名的类,那么每次使用的时候都加上包名即可。
7、有包类和无包类之间的访问问题
无包的类能访问有包的类吗? 能, 直接导入即可
有包的类能访问无包的类吗? 不能, 没有包名无法导入
8、重点
写类的时候要加上包名
类要public, 并且类名和文件名一致
导入类要写类名
编译用-d, 运行带包名
二、jar
1、jar是什么
jar是java文件的压缩格式
2、怎么打jar包
jar cvf jar文件名 要打包的文件夹名或类名 ...
例如:jar cvf day11.jar cn org, 把cn和org两个文件夹以及其中的class文件打包成一个名为day11.jar的文件。
3、怎么运行jar包
打开jar文件中的META-INF文件夹, 找到MANIFEST.MF文件,拷贝出来加上一行配置, 指定Main-Class。
例如:
Main-Class: org.it315.PackageDemo
java -jar jar包名
4、怎么使用jar包中的类
把jar包的路径配置到classpath环境变量中就可以使用jar包中的类了。
三、多线程
1、多线程
进程:
线程:
单线程:
多线程:
2、jvm启动是多线程的吗?
3、如何实现多线程呢?
A:继承Thread类
步骤:
定义一个类,继承Thread类
重写run方法
调用start方法.
启动线程
调用run方法
其中:
Thread类中的常用方法:
Thread(String name):通过构造给线程起名字
setName(String name):通过set方法给线程起名字
getName():获取线程的名称
currentThread():获取当前线程的一个对象引用
获取哪些没有直接继续Thread类的线程名称
B:实现Runnable接口
步骤:
定义一个类,实现Runnable接口
重写run方法
创建实现了Runnable接口的子类对象,并把该对象作为参数传递给Thread类的对象。这个时候,调用Thread类的start方法。
4、线程的状态
A:被创建
B:运行
C:临时阻塞
D:冻结:sleep、wait导致阻塞
sleep的时间到了,wait的被唤醒了,就到了就绪状态
E:消亡
5、卖票的问题
A:继承Thread实现卖票
这个时候,我们的票需要定义为静态的。但是呢,我们不建议这样做。
1、静态生命周期长
2、java是单继承,继承了Thread后就不能继承别的类,如果能有接口实现岂不是更好
B:实现Runnable接口卖票
在这里,我们就发现卖票除了问题(线程安全问题)。
线程安全问题怎么产生的?
多个线程延迟访问
线程的随机性
6、解决线程安全问题
A:同步代码块
格式:
synchronized(对象) {
//被同步的代码,也就是可能出现安全问题的代码
}
B:同步方法
就是在方法上加synchronized关键字即可。
C:同步的前提:
a、同步需要两个或者两个以上的线程
b、多个线程使用的是同一个锁。
未满足这两个条件,不能称其为同步。
D:同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
7、重点:
多线程的两种实现。
线程的生命周期。理解
用同步实现卖票。
单例的安全问题:
1 class Single { 2 private Single(){} 3 4 private static Single s = null; 5 6 public static Single getInstance() { 7 if(s==null) { 8 //1234 9 s = new Student(); 10 } 11 return s; 12 } 13 }
单例延迟举例:
1 class SingleDemo { 2 public static void main(String[] args) { 3 Sin s1 = new Sin(); 4 Sin s2 = new Sin(); 5 s1.start(); 6 s2.start(); 7 try{ 8 Thread.sleep(5); 9 } 10 catch (Exception e){ 11 } 12 System.out.println(s1.i==s2.i); 13 System.out.println(s1.i); 14 System.out.println(s2.i); 15 } 16 } 17 18 class Sin extends Thread{ 19 Single i; 20 public void run (){ 21 i = Single.getIntance(); 22 } 23 } 24 25 class Single{ 26 private static Single s = null; 27 private Single(){} 28 public static Single getIntance(){ 29 if (s == null){ 30 try{ 31 Thread.sleep(0); 32 } 33 catch (Exception e){ 34 } 35 s = new Single(); 36 } 37 return s; 38 } 39 }