黑马程序员 -- Java基础学习(5)

来源:互联网 发布:js实现拖拽工作流配置 编辑:程序博客网 时间:2024/06/11 19:31

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


多线程

进程:正在执行中的程序  进程执行都有顺序,该顺序是一个执行路径,或者叫一个控制单元线程:进程中一个独立的控制单元,控制进程的执行  一个进程中至少有一个线程jvm启动时有一个进程java.exe  该进程中至少有一个线程,运行的代码存在于main方法中,该线程可以称为主线程  实际上jvm启动时不止一个线程,还有垃圾回收机制的线程自定义线程    ThreadDemo.java第一种方法:继承Thread  class Demo extends Thread {  public void run() {  …  }  }  Demo d = new Demo();  d.start();1.定义类继承Tread2.重写Thread类中的run方法  重写的原因:Thread类用于描述线程,类中定义了一个功能用于存储要运行的代码,即run方法  目的:将自定义的代码存储在run方法中让线程运行3.调用start方法启动线程调用run方法若只调用run,则没有运行创建的线程,只是单独运行run方法
例子:TreadTest.java
第二种方法:声明实现Runnable接口的类  new Thread(d).start();
定义类实现Runnable接口
重写Runnable接口中的run方法
  将线程要运行的代码存放在该run方法中
通过Thread类建立线程对象
Runnable接口的子类对象作为实参传递给Thread类的构造函数
  自定义的run方法所属对象是Runnable接口的子类对象
  要让线程运行指定对象的run方法必需明确run方法来自哪个对象
调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
两种方法的区别
实现方式的好处:避免单继承的局限性
  java只有单继承,如果已经继承了某个类,就无法继承Thread类
  定义线程时建议使用实现方式
区别:线程代码存放位置
继承ThreadThread子类的run方法中
实现Runnable:接口子类的run方法中
对于单核在某一时刻只能有一个程序在运行,CPU快速切换以达到同时运行的效果
  多线程的运行可以看成CPU执行权的抢夺,特点:随机性
线程的运行状态
  获取线程对象以及名称    ThreadTest.java线程有自己的默认名称 Thread-编号,从零开始设置线程名  super(name);  setName()  • static Thread currentThread() 返回当前线程对象的引用    Thread.currentThread().getName();    this.getName();    对于第一种定义方法以上两种写法效果一样卖票程序    TicketDemo.java线程安全问题    TicketDemo2.java出现原因:多条语句在操作同一个线程共享数据是,一个线程还没有执行完时另一个线程参与进来解决方法:一个线程的执行过程中其他线程不可以参与、访问同步代码块  synchronized(对象) {  需要同步的代码  }银行存钱例子    BankDemo.java同步函数 synchronized修饰同步函数使用的锁是this静态同步函数使用的锁是class  静态函数中不能使用this  进内存中没有本类对象,但是一定有该类对应的字节码文件对象  所以静态同步方法使用的锁是该方法所在类的字节码文件对象 类名.class死锁    DeadLockTest.java线程间通信就是多个线程在操作同一个资源,但是操作的动作不同  InputOutputDemo.java等待唤醒机制 wait() notify()  InputOutputDemo2.java• 等待时线程存在线程池中wait notify notifyAll方法是Object类中的,但是只用在同步中,因为要对持有监视器(锁)的线程进行操作之所以定义在Object类中,是因为在操作同步线程时,必须在前面加上锁对象的名字,waitnotify必须由同一个锁完成
  而锁可以是任意对象,可以被任意对象调用的方法必须定义在Object类中生产者消费者    ProducerConsumerDemo.java  用while判断标志  notifyAll停止线程stop方法已经过时run方法结束时线程会结束多线程代码多是循环结构,控制住循环就可以让run方法结束当线程冻结时,不会读到表姐,也就无法退出循环  此时可以使用interrupt方法,将处于冻结状态的线程恢复到运行状态Tread类的其他方法setDemon 守护线程(后台线程)  当正在运行的线程都是守护线程时,jvm退出join() 抢夺cpu执行权 临时加入线程运行  主线程只有等join的线程执行完才会接触冻结  JoinDemo.javatoString()  线程组  优先级优先级:默认为5yield():暂停当前正在执行的线程对象,执行其他线程需要单独运行某些代码时,封装为线程运行  new Thread() {  public void run() {  …  }  }.start();  Runnable r = new Runnable() {  public void run() {  …  }  };  new Thread(r).start();

0 0
原创粉丝点击