线程:每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,称为线程。操作系统中的每一个进程中都至少存在一个线程。
多线程:是指一个进程在执行过程中可以产生多个单线程,这些单线程程序在运行时是相互独立的,它们可以并发执行
在Java中提供了两种多线程实现方式:一种是继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码;另一种是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
一、继承Thread类创建多线程
在Thread类中,提供了一个start()方法启动新线程,线程启动后,虚拟机会自动调用run()方法,如果子类重写了该方法便会执行子类中的方法。演示如下
package Text4;
public class text2 {
public static void main(String[] args) {
MyThread myThread= new MyThread();//创建线程MyThread的线程对象
myThread.start();//开启线程
while (true){//通过死循环语句打印输出
System.out.println("main()方法在运行");
}
}
}
class MyThread extends Thread{
public void run(){
while (true){//通过死循环语句打印输出
System.out.println("MyThread类的run()方法在运行");
}
}
}

单线程的程序在运行时,会按照代码的调用顺序执行,而在多线程中,main()方法和MyThread类的run()方法却可以同时运行,互不影响,这正是单线程和多线程的区别。
二、实现Runnable接口创建多线程
通过继承Thread类实现了多线程存在一定的局限性。因为Java只支持单继承,一个类一旦继承了某个父类就无法再继承Thread类。
为了克服这一缺陷,Thread类提供了另外一个构造方法Thread(Runnable target),Runnable是一个接口,它只有一个run()方法。当通过这一方法创建线程对象时,只需为该方法传递一个实现了Runnable 接口的实例对象,这样就不需要调用Thread类中的run()方法了。下面用代码进行演示如何创建
package Text4;
public class text2 {
public static void main(String[] args) {
MyThread myThread= new MyThread();//创建线程MyThread的实例对象
Thread thread=new Thread(myThread); //创建线程对象
thread.start();//开启线程,执行线程中的run()方法
while (true){
System.out.println("main()方法在运行");
}
}
}
class MyThread implements Runnable{
public void run(){ //线程的代码段,当调用start()方法时,线程从此处开始执行
while (true){
System.out.println("MyThread类的run()方法在运行");
}
}
}

通过对比两种实现的方式,可以看出实现Runnable接口相对于继承Thread类来说,具有以下优势:
1、适合多个相同程序代码的线程去处理同一个资源的情况,把线程同程序代码、数据有效分离,很好地体现了面向对象的设计思想。
2、可以避免由于Java的单继承带来的局限性。在开发中经常碰到这样一种情况,即使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,因此不能使用继承Thread类的方式,只能采用实现Runnable接口的方式
2372

被折叠的 条评论
为什么被折叠?



