java多线程处理

来源:互联网 发布:汽车dsp调音数据参考 编辑:程序博客网 时间:2024/06/15 19:59

1、线程与进程的基本概念与联系:

进程是应用程序的运行实例,而线程是进程内的一个执行单元;

一个进程可以包含多个线程,而一个线程必须要有一个父进程;

2、线程和进程之间的区别

 进程之间不能够共享内存,但是线程之间可以共享内存;

系统创建进程的时候,需要为进程重新分配系统资源。但是,在创建线程的时候,不用重新分配系统资源。

3、线程的分类:

系统级线程(核心进程):负责管理不同进程之间的多个线程,按照相同的优先调度方法进行调度

用户级线程:线程的调度算法和调度过程全部由用户自行决定,运行时不需要要特定的系统支持。

4、如何创建和启动一个线程

方式一:继承Thread类,定义一个类,继承Thread类,然后实现父类的run()方法;

方式二:实现Runnable接口,定义一个类让它实现Runnable接口,然后实现run()方法,在创建线程的时候,需要new一个Thread对象,然后把这个Runnable对象作为参数传递进去;

5、线程的生命周期:

    A、新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存。
    B、就绪(可运行)状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的线程位于可运行池中,等待获得CPU的使用权
     C、运行状态:处于这个状态的线程,占用CPU,执行程序的代码。
     D、阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态分为三种情况:
     A、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中
     B、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的 琐池中。
     C、 其它的阻塞状态:当前线程执行了sleep()方法,或者调用了其它线程的join()方法,或者发出了I/O请求时,就会进入这个状态中。

      死亡状态:当线程退出了run()方法,就进入了死亡状态,该线程结束了生命周期。或者正常退出;或者遇到异常退出
Thread类的isAlive()方法判断一个线程是否活着,当线程处于死亡状态或者新建状态时,该方法返回false

6、java线程优先级:

用setPriority()方法修改线程的优先级,最大值是10,通常是5;

7、线程之间调度:

  join()—》将当前线程加入到另一个线程的末尾,只有前面一个线程执行完,另一个线程才可能继续执行;

  sleep()—》将当前线程睡眠指定的毫秒数,睡眠的时候会释放它所控制的处理器资源;

   yield()—》不会让当前线程转入阻塞状态,而是转入可运行状态;

  setDaemon()—》把一个线程设为后台线程,一个后台线程从属于创建它的线程,创建它的线程结束时,这个后台线程也会跟着消亡。

8、线程之间的同步控制:

同步整个方法:对象的锁是指this关键字指向当前对象的锁,如果一个类中有多个同步方法,这些方法之间是互斥的。

同步代码块:对象可以指定。

9、线程之间通信:

wait()、notify()、notifyAll()方法