首页 > 代码库 > 多线程

多线程

进程的特点:
  1.进程是系统运行程序的基本单位
  2.每一个进程都有自己独立的一块内存空间,一组系统资源
  3.每一个进程的内部数据和状态都是完全独立的
    线程是程序总执行的最小单位

线程和进程的联系及区别:
  一个进程中至少要有一个线程
  资源分配给进程,同一进程的所有线程共享该进程的所有资源
  处理机分配给线程,即真正在处理机上运行的是线程
线程调度方法:
  1.join()方法
    使当前线程暂停执行,等待调用该方法的线程结束后再继续执行本线程.
  2.sleep()方法
    当前线程睡眠(毫秒),线程有运行中的状态进入不可运行状态,睡眠时间过后线程会再进入可运行状态
  3.yield()方法
    暂停当前线程运行,允许其他线程执行,该线程仍处于可运行状态,不转为阻塞状态.此时,系统选择其他相同或更高优先级的线程执行,若无
    其他相同或更高优先级线程,则该线程继续执行.

  sleep()方法和yield()方法区别
    slee()方法                   yiled()方法
    使当前线程进入被阻塞的状态           使当前线程转入暂停执行的状态

    即使没有其他等待运行的线程,当前线程      如果没有其他等待执行的线程,当前线程会马上恢复执行
    也会等待指定的时间

    其他等待执行的线程的机会是均等的        会将优先级相同或更高的线程运行

1.多线程的三种实现方式
  1,继承Thread类
    a:创建一个自定义类继承Thread类,重写run方法
    b:在准备执行的代码中创建自定义线程对象
    c:开启线程使用start方法,多次开启同一个线程是非法的
  2,实现Runnable接口
    a:创建一个Runnable接口的实现类,实现run方法
    b:在准备执行的代码中创建Runnable接口的实现类对象
    c:使用Thread类中的带参数构造方法将Runnable接口的实现类作为参数传递
    d:开启线程
  3,匿名对象和匿名内部类方式实现多线程
2.多线程的方法
  a:优先级越高说明抢占到CPU的概率越大,跟先后执行没有关系
  b:线程的join方法就是线程插队,插队就是说被插队的线程要停止执行,
    放弃CPU使用权给插队者执行代码,直到插队的线程执行完毕后,被插队的线程才能开始执行
  c:sleep方法是Thread类中的静态方法,可以通过类名直接调用即可,功能是让当前正在执行的线程暂停执行,暂停的时间由参数来确定
3.同步代码块和同步方法
  a:synchronized (object) {
    System.out.print("世");
    System.out.print("界");
    System.out.print("你");
    System.out.println("好!");
  }
    在CPU执行到这段代码的时候,不希望被别的线程抢去CPU
    同步代码块中的锁可以是任意的对象
  b:同步方法和同步代码块的区别是:同步代码块只是被包含的代码在执行的时候不会被别人抢去CPU
    同步方法的特点是方法在执行的时候不会被别人抢去CPU
4.线程间通信
  a:非静态的同步方法的锁是this
  b:同步代码块的话是任意的对象

方法:
  wait()方法:调用wait()方法,会挂起当前线程,并释放共享资源的锁.
  notify()方法:调用任意对象的notify()方法会在因调用该对象的wait()方法而阻塞的线程中随机选择一个解除阻塞,但要等到获得锁后才可真正执行.
  notifyAll()方法:调用了notifyAll()方法会将因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞.
  ====>Object类的final方法,被所有的类继承且不允许重写.只能在同步方法或者同步代码块中使用,否则会抛出异常.

 

多线程