进程
进程:一个程序的运行过程
线程:组成这个程序的并行的模块
一个进程可以包含多个线程。
线程的创建
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
1.继承Thread类
继承Thread类,重写run()方法,调用start开启线程
public class miloThread1 extends Thread{
@Override
public void run(){
//...
}
}
线程在主函数中的创建
public static void main(String[] args){
//创建对象
miloThread1 = new miloThread11();
//开启线程
miloThread1.start();
}
线程不一定立即执行,顺序是由CPU安排调度的
2.实现Runnable接口
- 定义MyRunnable类实现Runnable接口
- 实现run()方法,编写执行体
- 创建线程对象,调用start()方法启动线程
public class miloThread2 implements Runnable{
@Override
public void run(){
//...
}
}
public static void main(String[] args){
//创建runnable的接口实现类对象
miloThread2 = new miloThread2();
//创建线程对象,通过线程对象来开启线程 此对象作为代理
Thread thread = new Thread(miloThread2);
//用代理对象开启线程
thread.start();
//上面两行代码可简写为
new Thread(miloThread2).start();
}
区别:runnable需要在创建实现对象后,再创建代理对象,用代理对象开启线程。
两种方法的区别
资源方面
每次利用继承thread创建线程时,都要重新new一个新的xxxthread对象,当多个线程运行时,不同的thread修改的资源不同。
使用runnable接口时,可以保证只new一个runnable对象,且同时有多个线程执行任务。因此,线程之间会操作同一份数据。
继承方面
由于java父子类之间单继承的特性,导致继承得到的thread类无法再去继承其他父类,局限性较大。
而接口具有多继承的特性,一个类可以实现多个不同的接口,因此该类的可实现功能会更多,更方便。