在学习多线程之前,先来了解一些概念:
进程与线程
进程:是程序的实体,程序一旦运行就是进程。(资源分配的最小单位)
线程:是进程内独立执行的一个单元执行流。(CPU调度的最小单位)
概括:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,进程与线程之间的关系是包含关系,一个进程中可以有多个线程并发执行。
进程的三种基本状态:
就绪态(ready):已经具备运行条件,但由于没有空闲CPU而暂时不能运行。进程已经拥有了除处理机之外的所有需要的资源,一旦获得处理机立即进入运行状态开始运行。(万事俱备只欠CPU)
运行态(running):占有CPU并在CPU上运行。单核处理机环境下,每一个时刻最多只有一个进程处于运行状态(双核环境下可以有两个)
阻塞态(waitting/blocked):因等待某一件事而暂时不能运行。如:等待系统分配打印机,等待读磁盘的操作结果。
线程的五种状态:
创建(new):准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
就绪(runnable):调用了start()方法, 等待CPU进行调度
运行(running):执行run()方法
阻塞(blocked):暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
死亡(terminated):线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)
进程之间如何通信?
通过TCP/IP的端口来实现
线程之间如何通信?
同一个进程内的线程是共享内存和文件的,只要指针指向的是同一个地址就可以访问对方的内存
java中的多线程开发:
java中创建线程有两种方式:继承 Thread 类或者实现 Runnable 接口
至于是使用继承的方式还是实现接口的方式就看实际的需要了。这里简单说一下,因为java不能多重继承的缘故,使用继承的方式创建线程类将不利于扩展,但是实现接口的方式则不利于传参。
下面是一个小例子,对比一下使用多线程和不使用多线程的区别,例子中使用的是实现接口的方式创建线程类:
测试用例代码:
运行结果:
有兴趣的话可以把同步关键字去掉再看看运行的结果
附录:=====================================================================================
CookTeaUsual 类的代码
CookTeaThread implements Runnable 的代码