线程基础知识
程序
是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。
进程
- 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间。
- 进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程
线程
- 线程由进程创建的,是进程的一个实体。
- 一个进程可以拥有多个线程。
- 单线程:同一个时刻,只允许执行一个线程。
- 多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。
-
并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。
-
并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行。并发和并行可以同时存在。
线程基本使用
在java中线程来使用有两种方法:
- 继承Thread类,重写run方法。
- 实现Runnable接口,重写run方法。
应用案例1—继承Thread类
public class thread01 {public static void main(String[] args) {//启动一个进程,会先进入主线程 (main线程)//创建Cat对象,可以当做线程使用Cat cat = new Cat();cat.start();//启动线程 -> 最终会执行cat的run方法cat.run();//run方法就是一个普通的方法,没有真正的启动一个线程,就会把run方法执行完毕,才 向下执行//说明:当main线程启动一个子线程 Thread-0,主线程不会阻塞,会继续往下执行。//这时,主线程和子线程是交替执行/* start源码解读(1)public synchronized void start() {start0();}(2)start0()是本地方法,是JVM调用,底层是c/c++实现真正实现多线程的效果,是start0(),而不是run()private native void start0();*/}
}//通过继承thread类创建线程
//1、当一个类继承 Thread类,该类就可以当作线程类使用
//2、重写run方法,写上自己的业务代码
//3、run Thread类,实现了 Runnable接口的run方法
class Cat extends Thread{int times = 0;@Overridepublic void run() { //重写run方法,写上自己的业务逻辑while (true) {//该线程每隔1秒。在控制台输出“瞄瞄,我是小猫咪"System.out.println("瞄瞄,我是小猫咪" +(++times));//让该线程休眠1秒ctrl+alt+ttry {Thread.sleep(1000); //一千毫秒}catch (InterruptedException e) {e.printStackTrace();}if(times == 4) { //当times到4,退出while,这时线程也就退出.break;}}}
}
应用案例2—实现Runnable接口
public class thread02 {public static void main(String[] args) {Dog dog = new Dog();//dog.start(); 这里不能调用start//创建Thread对象,把dog对象(实现Runnable),放入ThreadThread thread = new Thread(dog);thread.start();}
}
class Dog implements Runnable{ //通过实现Runnable接口来开发线程int count=0;@Overridepublic void run() { //普通方法while (true){System.out.println("小狗"+(++count)+Thread.currentThread().getName());//休眠一秒try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if (count == 10) break;}}
}
继承Thread vs 实现Rtnnable的区别
- 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口。
- 实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议使用Runnable。
多线程机制
当启动一个进程,进程会启动一个主线程,主线程里面会开启若干子线程,当主线程和所有子线程都结束时,进程结束。