黑马程序员——java多线程

时间:2023-02-20 13:06:56

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

//=====================================================================
//@TITLE:
//    java多线程
//@AUTHOR:
//    Benwolf
//@DATE:
//    Friday  4-January-2013
//=====================================================================

java多线程(1、概述)
进程:正在进行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
WPS:word processing system
线程:就是进程中的一个独立执行的控制单元,线程在控制着线程的执行。
每一个进程中至少有一个线程。
java vm 启动的时候会有一个java.exe
该进程中至少一个线程负责java程序的执行。
而且这个线程运行的代码存在于main方法中。
该线程称之为主线程。
扩展:其实更细节说明jvm,jvm启动时不一个止线程,还有负责垃圾回收机制的线程。
1、如何在自定义的代码中,自定义一个线程呢?
通过API查找,java已经提供了对线程这类这类事物的描述,就Thread类。创建线程的第一种方式:继承Thread类。
步骤:1、定义类继承Thread类
2、复写Thread类中的run方法
    目的:将自定义的代码存储在run方法,让线程运行。
3、调用线程的start方法,
该方法有两个作用:启动线程,调用run方法

发现运行结果每一次都不一样。
因为多个线程都获取CPU的执行权,cpu执行到谁谁就执行。
明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)
cpu做着快速的切换,以达到看上去同时执行的效果。

我们可以形象的把多线程的运行行为在互相抢夺cpu的执行权。
这是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间,cpu说了算。

为什么要覆盖run方法呢?
Thread类用于描述线程。
该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。
也就是说Thread类中的run方法是用于存储线程要运行的代码。

同步函数用的是哪一个锁呢?
函数需要被对象调用,那么函数都有有一个所属对象引用,就
是this。所以同步函数使用的锁是this。
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不再是this,因为静态方法中也不可以定义this。
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class 该对象的类型是class

对于多个生产者和消费者。 为什么药定义while判断标记。 原因:让唤醒的线程再一次判断标记
    
      为什么定义notifyAll, 因为需要唤醒对方线程。 因为只有notify, 容易出现只唤醒本方线程的情况。导致程序中 的所有都等待

线程间通讯:
      其实就是多个线程在操作统一资源,
      但是操作的动作不同。
      wait();notify();notifyAll();都使用在同步中,因为要对持有监视器(锁)
      的线程操作。所以要使用在同步中,因为只有同步才具有锁。
     
      为什么这些线程的方法要定义在Objec类中呢?
      因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,
      只有同一个锁上的被等待线程,可以被同一个锁上的notify()唤醒。
      不可以对不同锁中的线程进行唤醒。
     
      也就是说,等待和唤醒必须是同一个锁。
     
      而锁可以是任意对象,所以可以被任意对象调用的方法定义Object中

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