Java多线程编程

为了满足业务需求,无论PC(个人计算机)还是智能手机(Smart Phone)现在都支持多任务,都能够编写并发访问程序。多线程编程可以编写并发访问程序。

在多线程OS(操作系统)中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。一般可以在同一时间内执行多个程序的操作系统都有进程的概念。

打开Windows当前运行的进程,如图所示:

进程

一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。

在Windows操作系统中一个进程就是一个exe或者dll程序,它们相互独立,互相也可以通信,在智能手机操作系统中进程间的通信应用也是很多的。

线程

线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序控制的流程,但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时,开销要比进程小的多,正因如此,线程被称为轻量级进程。一个进程中可以包含多个线程。

主线程

Java程序至少会有一个线程,这就是主线程,程序启动后是由JVM(Java虚拟机)创建主线程,程序结束时由JVM停止主线程。主线程和子线程的关系是主线程它负责管理子线程,即子线程的启动、挂起、停止等等操作

进程、主线程和子线程关系如图所示:

获取主线程示例代码如下:

publicclass MyThread{

    publicstatic void main(String[] args) {

      //获取主线程

      Thread thread= Thread.currentThread();

      System.out.println("主线程名:" + thread.getName());

    }

}

线程的状态

在线程的生命周期中,线程会有几种状态,如图所示,线程有5种状态。下面分别介绍:


1. 新建状态

        新建状态(New)是通过new等方式创建线程对象,它仅仅是一个空的线程对象。

2. 就绪状态

      当主线程调用新建线程的start()方法后,它就进入就绪状态(Runnable),此时的线程尚未真正        开    始执行run()方法,它必须等待CPU的调度。

3. 运行状态

      CPU的调度就绪状态的线程,线程进入运行状态(Running),处于运行状态的线程独占CPU,        执行run()方法。

4. 阻塞状态

      因为某种原因运行状态的线程会进入不可运行状态,即阻塞状(Blocked),处于阻塞状态的线      程JVM系统不能执行该线程,即使CPU空闲。如下几个原因会导致线程进入阻塞状态:

        1)当前线程调用sleep()方法,进入休眠状态。

        2)被其他线程调用了join()方法,等待其他线程结束。

        3)发出I/O请求,等待I/O操作完成期间。

        4)当前线程调用wait()方法。

5. 死亡状态

线程退出run()方法后,就会进入死亡状态(Dead),线程进入死亡状态有可以是正常实现完成      run()方法进入,也可能是由于发生异常而进入的。

线程间通信

如果两个线程之间有依赖关系,线程之间必须进行通信,互相协调才能完成(任务)工作。

例如,一个线程生成了一些数据,将数据压栈;另一个线程需要这些数据,将数据出栈。这两个线程互相依赖,当堆栈为空时,消费线程无法取出数据时,应该通知生成线程添加数据;当堆栈已满时,生产线程无法添加数据时,应该通知消费线程取出数据。

完成线程间的通信,在Java中有几个方法:

    (1)void wait():使当前线程释放对象锁,然后当前线程处于对象等待队列中阻塞状态。,等待              其他线程唤醒。

    (2)void wait(long timeout):同wait()方法,等待timeout毫秒时间后进入队列中阻塞状                            态。

      (3)void notify():当前线程唤醒此对象等待队列中的一个线程,线程将进入就绪状态。

      (4)void notifyAll():当前线程唤醒此对象等待队列中的所有线程,线程将进入就绪状                              态。

你可能感兴趣的:(Java多线程编程)