线程
-
线程是程序执行的一条路径,一个进程中可以包含多条线程
-
多线程并发执行可以提高程序的效率,可以同时完成多项工作
比如:听歌的同时浏览网站,聊qq。手机后台也可以同时执行多个后台程序。
并行和并发
并行:两个任务同时进行,甲任务进行的同时,乙任务也在进行。(需要多核CPU)
并发:两个任务都进行请求运行,而处理器只能接受一个任务,就把这两个任务安排轮流进行,由于时间间隔太短,使人感觉两个任务都在同时进行。
java程序运行原理
java命令会启动java虚拟机,启动jvm,等于启动了一个应用程序,也就是启动了一个进程,该进程会自动启动一个“主线程”,然后主线程去调用这个类的main方法
jvm时多线程,它至少启动了垃圾回收线程和主线程,所以是多线程。
线程的生命周期
多线程程序实现的方式
1.继承Thread类
-
定义类继承Thread
-
重写run方法
-
把新线程要做的事写在run方法中
-
创建线程对象
-
调用start()方法开启线程,内部会自动执行run方法
package Test1;
class MyThread extends Thread{
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("继承Thread类的子线程");
}
}
}
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 1000; i++) {
System.out.println("主线程main");
}
}
}
2.实现Runnable接口
-
定义类实现Runnable接口
-
实现run方法
-
把新线程要做的事写在run方法中
-
创建自定义的Runnable的子类对象
-
创建Thread对象,传入Runnable的子类对象
-
调用start()开启新线程,内部会自动调用Runnable的run()方法
package Test1;
class MyThread implements Runnable{
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("实现Runnable接口的子线程");
}
}
}
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.start();
for (int i = 0; i < 10; i++) {
System.out.println("主线程main");
}
}
}
实现Runnable接口的原理
-
看Thread类的构造函数,传递了Runnable接口的引用
-
通过init()方法找到传递的target给成员变量的target赋值
-
查看run方法,发现run方法中有判断,如果target不为null就会调用Runnable接口子类对象的run方法
两种实现方式的区别
查看源码的区别:
-
继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
-
实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Ru