**线程是程序执行的一条路径,一个进程中可以包含多条线程。 **
1.多线程并行和并发的区别
并行就是两个任务同时运行,就是甲任务运行的同时,乙任务也在运行(需要多核CPU)。
并发是指两个任务都请求运行,而处理器只能接受一个任务,就把这两个任务安培轮流运行,由于时间间隔较短,使人感觉两个任务都在运行。
2.线程的实现方式1——继承Thread类
1.使用步骤
a.定义类继承Thread
b.从写 run方法
c.把新线程要做的事情写在run方法中
d.创建线程对象
e.开启新线程(start方法),内部会自动执行run方法
案例
public class Demo{
public static void main(String[] args){
//使用子线程
MyThread thread=new MyThread();
//不能通过thread.run()来执行任务,因为这种方式是主线程执行的。
thread.start();//正确的方式,内部会开启新的线程,会直接调用线程的run方法
//循环创建线程;多线程是抢占式执行的
for(int i=0;i<10;i++){
MyThread thread=new MyThread();
thread.start();
}
}
}
class MyThread extends Thread{
@Override
public void run(){
System.out.println("aaa.........");
}
}
3.线程的实现方式2——定义类实现Runnable接口
1.使用步骤
a.定义类实现Runnable接口
b.实现run方法
c.把新线程要做的事情放在run方法中
d.创建自定义的Runnable的子类对象创建Thread对象,传入Runable
e.调用start()开启新线程,内部会自动调用Runnable的run方法
public class Demo{
public static void main(String[] args){
//创建Runnable对象
MyThread runnable=new MyThread();
//创建Thread对象
Thread thread=new Thread(runnable);
//启动线程
thread.start();
//循环创建线程
for(int i=1;i<10;i++){
Thread thread=new Thread(runnable);
thread.start();
}
}
}
class MyThread implements Runnable{
@Override
public void run(){
System.out.println("aaa..."+Thread.currentThread());//当前线程
}
4.上述两种方式的区别
1.查看源码的区别
继承Thread由于子类重写了Thread的fun方法,当调用start方法时直接找子类的run方法。
实现Runnable构造函数中传入了Runnable的引用,有个成员变量记住了它,调用run方法时内部判断成员变量Runnable的引用是否为空。
2.继承Thread
好处:可以直接使用Thread类中的方法,代码简单。
坏处:如果已经有了父类,就不能用这种方法。
3.实现Runnable接口
好处:即使自己定义的线程有了父类也没关系,因为有了父类也可以实现接口,代码更灵活。
坏处:不能直接使用Thread中的方法,需要先获取到线程对象后,才能得到Thread的方法,代码复杂。