黑马程序员----包、多线程

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

1、包(package)

a、对类文件进行分类管理。

b、给类提供多层命名空间。

c、定义包应放在文件第一行。

定义包:使用关键字package。包名的所有字母小写。

如:package  pack;

定义包名后,类名的全名前要加上包名。如:pack.java类名。

有了包后,范围变大,一个包中的类要被访问,必须要有足够大的权限,所以被访问的类要被public修饰。

此外,类公有后,被访问的成员也要公有才可以被访问。

总结:

包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。

不同包中的子类可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限只有两种:public    protected。

                                         public       protected     default        private

同一个类中                      可以            可以             可以          可以

同一个包中                      可以            可以             可以          不可以

不同包的子类                  可以            可以            不可以       不可以

不同包中非子类类          可以           不可以        


建议定义包名不要重复,可以使用url来完成定义,url是唯一的。

jar包:java的压缩包

2、多线程

进程:是一个正在执行中的程序。每一个进程执行都有一个执行的顺序,该顺序就是一个执行路径(或控制单元)。

线程:就是进程中的一个独立的控制单元。线程控制着进程的执行。

一个进程中至少有一个线程。

java VM 启动的时候会有一个进程java.exe。该进程中至少有一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。

扩展:其实jvm启动的不止一个主线程,还有一个垃圾回收线程。

如何自定义一个线程呢?

通过查阅API文档,可知java已经提供了对线程这类事物的描述,就是thread类。

创建线程的第一种方法:继承thread类,复写run方法,调用线程的start方法(启动线程)。

为什么要覆盖run方法?

thread类用于描述线程。该类定义了一个功能,用于存储要运行的代码,该存储功能就是run方法。也就是说thread类中的run方法,是用于存储线程要运行的代码。

多线程的一个特性:随机性。谁抢到谁执行,执行时间由CPU决定。

线程都有自己的名称:Thread-编号。

static Thread currentThread():获取当前线程对象。

getName():获取线程名称。

设置线程名称:setName或构造函数。

创建线程的第二种方法:实现Runable接口。

步骤:

a、定义类实现Runnable接口。

b、覆盖Runnable中的run方法。(将线程要运行的代码存放在该run方法中。)

c、通过Thread类建立线程对象。

d、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

e、调用Thread类的start方法开启线程。

两种方法的区别?

实现Runnable方式的好处:避免了单继承的局限性。在定义线程时,建议使用实现方式。

存放代码的位置不一样:

继承Thread方式:线程代码存放在Thread子类run方法中。

实现Runnable方式:线程代码存放在接口的子类的run方法。

多线程的运行会出现安全问题?

问题的原因是:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法: 对多条操作共享数据的语句,只能让一个线程执行完,在执行过程中,其他线程不可以参与执行。

java对于多线程的安全问题提供了专业的解决方式:就是同步代码块。

同步代码块:作用是保证同步中只有一个线程在执行。

synchronized(对象)

需要被同步的代码;

}

对象如同锁,持有锁的线程可以在同步中执行。没有持有锁的线程即使获取了cpu的执行权,也进不去,因为没有获取锁。

可以想象一下单人卫生间。进去之前要先判断里面有没有人。

同步的前提:

a、必须要有两个或者两个以上的线程。

b、必须是多个线程使用同一个锁。

好处:解决了多线程的安全问题。

弊端:多个线程需要判断锁,较为消耗资源。


一定要明确的问题:

a、明确哪些代码是多线程运行代码

b、明确共享数据

c、明确多线程运行代码中哪些语句是操作共享数据的。


同步两种表现形式:同步代码块同步函数(用synchronized修饰函数即可)

同步函数使用的锁是this

如果同步函数被静态修饰,那么使用的锁就不会是this,因为静态方法中也不可以定义this。

静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。即类名.class。该对象的类型是class。

静态的同步方法,使用的锁是该方法所在类的字节码文件对象。即类名. class。


单例设计模式:饿汉式;懒汉式(延时加载,存在安全隐患,需要设置同步)。


死锁:同步中嵌套同步,同步的锁不一样。



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值