黑马程序员:java线程

---------------------- android培训java培训、期待与您交流! ----------------------

 

1、进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
   线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
   Java虚拟机启动的时候会有一个进程java.exe。该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。其实,jvm启动不止一个线程,还有负责垃圾回收机制的线程。


2、创建一个线程有两种方式:
 第一种方式:继承Thread类。步骤:
 【1】定义类继承Thread。
 【2】复写Thread类中的run方法。其目的是:将自定义代码写在run方法中,让线程运行。
 【3】调用线程的start方法,该方法有两个作用:启动线程,调用run方法。
 为什么要覆盖run方法:Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。
 第二种方式:实现Runable接口。步骤:
 【1】定义类实现Runnable接口
 【2】覆盖Runnable接口中的run方法。将线程要运行的代码写在该run方法中。
 【3】通过Thread类建立线程对象。
 【4】将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
 为什么要将Runnable接口的子类对象传递给Thread的构造函数:因为,自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。


3、实现方式和继承方式的区别:继承Thread线程代码存放Thread子类run方法中。实现Runnable,线程代码存在接口的子类的run方法。实现方式好处:避免了单继承的局限性。在定义线程时,建义使用实现方式。


4、因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。对于某一个cpu,在某一个时刻,只能有一个程序在运行。cpu在做着快速的切换,以达到看上去是同时运行的效果。我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。这就是多线程的一个特性:随机性。因此多线程在程序运行过程中存在安全问题或是安全隐患。
    问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
    解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。Java对于多线程的安全问题提供了专业的解决方案。即同步代码块:
 synchronized(对象)
 {
  需要被同步的代码
 }
对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去。

同步的前提:
    i、必须要有两个或者两个以上的线程。
    ii、必须是多个线程使用同一个锁。
    iii、必须保证同步中只能有一个线程在运行。

    好处:解决了多线程的安全问题。
    弊端:多个线程需要判断锁,较为消耗资源,


5、同步函数用的是哪一个锁:函数需要被对象调用,那么函数都有一个所属对象引用。所以同步函数使用的锁是this。
   若同步函数被静态修饰后,使用的锁是什么呢?这时不再是this。因为静态方法中不可以定义this。静态方法进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。即:类名.class,该对象的类型是Class。


6、多线程编程应注意的问题:
 明确哪些代码是多线程运行代码。
 明确共享数据。
 明确多线程运行代码中哪些语句是操作共享数据的。


7、停止线程只有一种方式,即run方法结束。开启多线程运行,运行代码通常是循环结构。只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于了冻结状态。就不会读取到标记。那么线程就不会结束。当没有指定的方式让冻结的线程恢复到运行状态,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。Thread类提供该方法:interrupt();


8、线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。
 等待/唤醒机制。也就是常见的生产者消费者问题。
 【1】当多个生产者消费者出现时,需要让获取执行权的线程判断标记。通过while完成。
 【2】需要将对方的线程唤醒。仅仅用notify,是不可以的。因为有可能出现只唤醒本方。有可能会导致所有线程都等待。所以可以通过notifyAll的形式来完成 。

9、JDK1.5中提供了多线程升级解决方案:
 【1】将同步Synchronized替换成实现Lock接口操作,将隐式锁,升级成了显示锁。即lock()获取锁、unlock()释放锁、newCondition()绑定到此Lock实例的新Condition实例。
 【2】将Object中的监视器方法wait()、notify()、notifyAll()替换成实现Condition接口操作,和以前不同是:一个同步代码块具备一个锁,该锁已具备自己的独立wait和notify方法。即:await()、signal()、signalAll()。该对象可用Lock锁进行获取。

 

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值