第九章、线程

1、线程的概念


线程与进程

一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源,每一个进程的内部数据和状态都是完全独立的。  Java程序执行中的单个顺序的流控制称为线程,多线程则指一个进程中可以同时运行多个不同的线程,执行不同的任务。

线程与进程的区别:同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多 。

为什么需要多线程?提高CPU利用率

2、线程的创建

(1)通过继承Thread类创建线程

(2)利用Runnable接口产生线程

(3)两种创建线程方法的比较

方式一:直接继承线程Thread类。该方法编写简单,可以直接操作线程,由于已经继承了Thread,不能再继承其他类了;

public   MyThread   extends   Thread{

             ……

             public void run() {  线程体逻辑 }  

        }

创建及启动线程:

MyThread  t = new MyThread();

t.start();

方式二:实现Runnable接口。当一个类已继承了另一个类时,就只能用实现Runnable接口的方式来创建线程;另外,使用此方法的更多原因是多个线程共享某个对象的资源。

public  MyThread  implements  Runnable {

             ……

             public void run() {  线程体逻辑 }   

        }

创建及启动线程:

MyThread t = new MyThread();

Thread t1 = new Thread(t);

t1.start();

(4)多线程共享资源

3、线程的控制与调度

(1)线程的生命周期和状态的改变

例:join方法线程暂停执行示例---实现10000个随机数相加:

4、线程的同步机制

(1)安全问题:解决办法:对象监视器(monitor)与synchronized 

Synchronized的三种用法:

①synchronized 代码块:监视器就是指定的对象。

②synchronized 方法:监视器就是this对象。

③synchronized 静态方法:监视器就是相应的Class对象。

示例:

(2)死锁问题:如果多个线程都处于等待状态,彼此需要对方所占用的监视器所有权,就构成死锁(deadlock),Java即不能发现死锁也不能避免死锁。

注意:

1)可能发生死锁的代码执行中不一定会死锁,因为线程之间的执行存在很大的随机性。

2)线程方法suspend()、resume()、stop()由于存在引起死锁的可能,因而逐渐不用(Deprecated)

5、线程间的同步通信


使用wait和notify实现线程间同步通信

例:银行账户的存取款线程设计

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容