黑马程序员_Thread类与Runnable接口

来源:互联网 发布:儿童编程语言 编辑:程序博客网 时间:2024/06/05 07:29

------- android培训、java培训、期待与您交流! ----------

进程:是一个正在执行中的程序。
          每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。
           线程在控制着进程的执行。
一个进程中至少有一个线程。
使用线程技术多半是为了并发处理效果,单核通过CPU调度模拟多任务。
Java VM  启动的时候会有一个进程java.exe.
该进程中至少一个线程负责java程序的执行。
而且这个线程运行的代码存在于main方法中。
该线程称之为主线程。
其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。

创建线程的两种方式: 
1.继承Thread类,覆盖run方法 
2.实现Runnable接口,通过Thread类的带Runnable参数的构造函数传入到Thread对象内。

一般情况下,使用接口的方式生成线程,接口可以实现多继承,避免了单继承的局限性。

创建线程的第一种方式:继承Thread

1.定义类继承Thread

2.复写Thread类中的run方法

目的:将自定义的代码存储在run方法中,让线程运行。

3.调用线程的start方法,该方法有两个作用:启动线程,调用run方法。

Demo d = new Demo();//创建好一个线程

d.start();//启动线程,并调用run方法。

代码举例:

运行结果:

发现运行结果每一次都不同
因为多个线程都获取CPU的执行权。CPU执行到谁,谁就运行。
在某一个时刻,只能有一个程序在运行。(多核除外)
CPU在做着快速的切换,以达到看上去是同时运行的效果。
我们可以形象的把多线程的运行行为在互相抢夺CPU的执行权。
这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间,CPU说了算。

为什么要覆盖run 方法呢?
Thread 类用于描述线程。
该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
也就是说Thread类中的run方法,用于存储线程要运行的代码,主线程的代码存储在main方法中。
调用start方法的时候调用父类的run方法,子类继承Thread类,然后复写了父类的run方法, 则执行的时子类的run方法。
d.start();//开启线程并执行该线程的run方法。
d.run();//仅仅是对象调用方法,而线程创建了,并没有运行。

创建线程的第二种方式:实现Runnable

步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象

5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

代码举例:

运行结果:


实现方式和继承方式有什么区别?
实现方式好处:避免了单继承的局限性

由于java只支持单继承,当一个类已经继承了一个类的时候想要实现多线程就不能继承Thread类了,这时候需要实现runnable接口来实现,并实现Runnable中的run方法。
Thread类本身也实现runnable接口,Runnable接口的定义其实就是在确立线程要运行代码所存放的位置。

两种方式的区别:

继承Thread:线程代码存放在Thread子类run方法中。
实现Runnable:线程代码存在接口的子类的run方法。

下面我们说下实现Runnable接口方式的多线程与继承Thread类方式的多线程的不同
实现Runnable接口方式的多线程:
1.编程稍复杂.
2.如果需要访问当前线程,必须使用Thread.currentThread()方法. 
3.线程只是实现了Runnable接口,还可以继承其他类. 
4.在这种方式下,可以多个线程共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU,代码,数据分开,形成清晰的模型,较好地体现了面向
继承Thread类方式的多线程:
1.编程简单. 
2.如果需要访问当前线程直接使用this. 
3.已经继承了Thread类,无法再继承其他父类.
至于为什么runnable的实现类run方法里,如果想获得当前进程需要执行Thread.currnetThread()方法,但是Thread的继承类却只需要this就可以呢?


这里面必须是Thread.currentThread();
如果是this的话,this只能指当前对象,即MyRunnable的实例对象
而MyRunnable只实现了run接口,没有其他任何方法,所以如果只是this,那么没法操作线程的其他方法。
所以需要使用Thread.currentThread();
因为MyRunnable实例化后交给Thread对象
而Thread本身就实现了Runnable接口,所以直接this就可以了。


----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima