前提:
1:这两种方法都是通过重写run(),在run()方法中实现运行在线程上的代码
2:Runnable相比于Thread更适合多个相同程序代码去处理同一个资源的情况,通常采用Runnable
3:被synchronized 修饰的方法在某一时刻只允许一个线程访问
多线程
1.什么是线程
线程是程序执行的一条路径, 一个进程中可以包含多条线程
多线程并发执行可以提高程序的效率, 可以同时完成多项工作
2. 多线程并行和并发的区别
1) 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
2) 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
3. Java程序运行原理
Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个“主线程” ,然后主线程去调用某个类的main 方法。
4. JVM的启动是多线程的吗
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
多线程程序实现的方式
1.继承Thread
* 定义类继承Thread
* 重写run方法
* 把新线程要做的事写在run方法中
* 创建线程对象
* 开启新线程, 内部会自动执行run方法
classMyThread extends Thread { //1,定义类继承Thread
public voidrun() { //2,重写run方法
for(inti = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("threadrunning");
}
}
}
main:
MyThreadmt = new MyThread(); //4,创建自定义类的对象
mt.start(); //5,开启线程
for(inti = 0; i < 3000; i++) {
System.out.println("main");
}
2.实现Runnable
classMyRunnable implements Runnable { //1,自定义类实现Runnable接口
@Override
public voidrun() { //2,重写run方法
for(inti = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}
main:
MyRunnablemr = new MyRunnable(); //4,创建自定义类对象
//Runnabletarget = new MyRunnable();
Thread t= new Thread(mr); //5,将其当作参数传递给Thread的构造函数
t.start(); //6,开启线程
for(inti = 0; i < 3000; i++) {
System.out.println("bb");
}
两种方式的区别
* 继承Thread
* 好处是:可以直接使用Thread类中的方法,代码简单
* 弊端是:如果已经有了父类,就不能用这种方法
* 实现Runnable接口
* 好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
* 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
匿名内部类实现线程的两种方式
1. 继承Thread类