介绍:进程是正在运行的程序;
单线程:一个进程有一个执行路径;
多线程:一个进程有多条执行路径;
一、实现多线程的方法:
①.继承Thread类;
a.定义类继承Thread类;
b.在类中重写run()方法;
c.创建该类的对象;
d.启动线程;
❤两个小问题:
A.为什么重写run()方法?
因为run()方法是用来封装被线程执行的代码
B.run()方法和start()方法的区别?
run():分装线程执行的代码,直接调用,相当于普通方法
start():启动线程,由JVM调用此线程的run()方法1.a.定义类继承Thread类、b.在类中重写run()方法;
public class duothread01 extends Thread{
@Override
public void run() {
for(int x=0;x<25;x++){
System.out.println(getName() + ":" + x);
}
}
}
2.c.创建该类的对象、d.启动线程;
duothread01 dt01 = new duothread01();
duothread01 dt02 = new duothread01();
//启动线程
dt01.start();
dt02.start();
②.实现runnable接口;
a.定义一个类实现runnable接口;
b.类中重写run方法;
c.创建对象;
d.创建Thread类的对象,把声明的类对象作为参数
e.启动线程;第一步、a.定义一个类实现runnable接口、b.类中重写run方法;
package runnable01;
public class runnable01 implements Runnable {
//重写方法
@Override
public void run() {
for(int i= 0;i<20;i++){
//这里因为与Thread没有直接关系,所以需要获取主线程再获取线程名称
System.out.println(Thread.currentThread().getName()+ "," + i);
}
}
}
第二步、c.创建对象、d.创建Thread类的对象,把声明的类对象作为参数、e.启动线程;
package runnable01;
public class runnableDemo {
public static void main(String[] args) {
//创建实现类对象
runnable01 rb = new runnable01();
//创建线程:创建Thread类的对象,把runnable实现类对象作为参数,设置名称,不设置有默认值;
Thread t1 = new Thread(rb,"火箭");
Thread t2 = new Thread(rb,"飞船");
//启动线程
t1.start();
t2.start();
}
}
❤相比继承Thread类,实现runnable接口实现多线程的好处:
- 避免了Java单继承的局限性;