黑马程序员___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 }

 

posted on 2014-01-18 01:55  毛线球球  阅读(275)  评论(0编辑  收藏  举报

导航