说线程之前,先介绍一下进程,进程是指一个正在执行中的程序。而线程则是进程中的一个独立的控制单元,线程在控制着进程的执行。
一个进程中至少包括一个线程。
假如一个进程包括多个线程,一个线程控制着一种功能,那么,当执行一个进程时,cpu会迅速的切换执行不同的线程,从而达到多个功能同时进行的效果。
在一个程序中,如果要加入自定义的线程以达到不同功能同时进行的效果,有两种方法:1,继承法;2,实现法。
================================================================================================================================1,继承法:
步骤:
1,自定义类并继承Thread类
2,重写run方法,将要运行的代码写入run方法中(run方法中的代码就是自定义线程的功能的描述)
3,在主函数中建立自定义线程类的对象并调用其start()方法(用于启动线程并调用run()方法)
实例说明:
class NewThread extends Thread
{
public void run()
{
for(int i=0;i<60;i++)
System.out.println("Thread run");
}
}
class Demo
{
public static void main(String[] args)
{
NewThread n=new NewThread();
n.start();
for(int i=0;i<60;i++)
System.out.println("main run");
}
}
部分结果:
不难发现,执行是交错进行的,也就是说同时执行两个功能,而且每次执行的次序都不一样,取决于cpu的切换执行次序。
继承法加入自定义线程时要注意一个问题,如果对已经开启的线程对象再次调用start()方法时,在运行过程中会报错。
===============================================================================================================================2,实现法:
步骤:
1,定义一个自定义线程类并让其实现Runnable接口
2,重写Runnable接口中的run()方法,也是用来记录线程要运行的代码
3,通过Thread类来建立线程对象
4,将Runnable接口的子类即自定义线程类的对象作为实参传递给Thread类的构造函数
5,调用Thread类的start方法,用于开启线程并调用自定义线程类中的run方法
注意:之所以能够用实现法建立新线程是因为在系统定义的Thread类中包括一条构造函数:Thread(Runnable target)
实例说明:
class NewThread implements Runnable
{
public void run()
{
for(int i=0;i<60;i++)
System.out.println("Thread run");
}
}
class Demo
{
public static void main(String[] args)
{
Thread n=new Thread(new NewThread());
n.start();
for(int i=0;i<60;i++)
System.out.println("main run");
}
}
结果和继承法一模一样。
实现法的优点:如果自定义线程类已经继承了一个父类,那么就不能再继承Thread类了,因为java不支持多继承,而实现法正好能完美的解决这个问题,因此在实际运用中,建议使用实现法。
===============================================================================================================================
小知识点:
Thread类中提供了getName和setName的方法用来获取和定义线程的名字,定义线程的名字时,也可以通过Thread的构造函数:Thread(String name)来实现