Java线程基础

来源:互联网 发布:死或生5 mac版 编辑:程序博客网 时间:2024/05/29 13:16

近期一个做测试的朋友想转Java,问我要一些Java基础的知识,我在闲暇时间整理了一下自己的所学,一边希望自己共同学习,一边检验下自己所学,犹豫本人知识有限,有不对之处敬请见谅,希望指正。谢谢!


Java的多线程是允许不同的程序块一起运行,从而实现多任务处理的目的。


进程与线程

进程:进程是程序一次动态执行的过程。经历了从代码加载,执行到执行完毕的一个完整过程。也是进程本身从产生、发展到消亡的过程。多个进程(程序)在多进程操作系统中运行时,CPU会根据分时机制,每个进程获取自己的CPU时间片。由于CPU运行速度很快,使进程看似“同时”运行。

线程:线程是比进程更小的执行单位。线程是进程内部一个单一的顺序控制流。多线程就是指一个进程在执行过程中,可以产生多个线程。这些线程同时存在、同时执行,行成多条执行线索。一个进程可能包含多个同时执行的线程。


多线程是实现并发机制的一种手段。两者都是并发执行的基本单位。区别如下:

(1):同样作为执行的基本单元,线程比进程更小的执行单位。

(2):每个进程都有自己专属的内存区域,线程却共享内存单元,通过共享的内存单元来实现数据交换,实时通信与必要的同步操作。


线程的创建:

1 继承Thread类,覆盖run方法

2 实现Runnable接口,重写run方法

run方法就是线程的执行方法


实现Runnable接口比继承Thread的优势:

1 适合多个相同代码的线程去处理同一资源的情况。

2 避免Java中单继承带来的局限性。

3 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

事实上,几乎所有多线程应用都可用第二种方式,即实现Runnable接口。


线程的启动:

调用父类或接口的start方法,线程即可启动。

一个线程对象只能启动一次。


线程的状态

线程的状态:创建 就绪 运行 阻塞 终止



新建状态:创建一个线程后,线程就处于新建状态。此时已经有了相应的内存空间和其他资源。但处于不可运行状态。

例如 Thread thread = new Thread();

就绪状态:调用该线程的start()方法,线程进入就绪状态。

运行状态:就绪状态的线程被调用并获取处理器资源时,线程进入运行状态。执行run方法。

阻塞状态:一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用sleep()、wait()等方法,线程都将进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被消除后,线程才可以转入就绪状态。

死亡状态:线程调用stop()方法(已过时)或run()方法执行结束后,线程即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。


多线程的同步:

资源的共享 资源的占用 

同步代码块:关键字synchronized


synchronized(对象)
{
需要同步的代码 ;
}

同步方法:关键字synchronized

访问控制符 synchronized 返回值类型方法名称(参数)
{
…. ;
}

死锁:

一旦有多个进程,且它们都要争用对多个锁的独占访问,那么就有可能发生死锁。如果有一组进程或线程,其中每个都在等待一个只有其它进程或线程才可以执行的操作,那么就称它们被死锁了。


线程的生命周期:


控制线程生命周期的方法有很多种,如:suspend方法、resume方法和stop方法。但这三个方法都不推荐使用,其中,不推荐使用suspend和resume的原因是:
(1)、会导致死锁的发生。
(2)、它允许一个线程(甲)通过直接控制另外一个线程(乙)的代码来直接控制那个线程(乙)。
虽然stop能够避免死锁的发生,但是也有其它的不足:如果一个线程正在操作共享数据段,操作过程没有完成就被“stop”了的话,将会导致数据的不完整性。因此stop方法也不提倡使用了!

通过控制run方法中循环条件的方式来结束一个线程的方法是推荐读者使用的,这也是实际中用的最多的方法。



原创粉丝点击