多线程
基础概念
-
程序:为了特定的任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象
-
进程:是程序的一次执行过程,或者是程序正在运行的一种程序,是一个动态的过程,有自身的产生,存在和消亡的过程。比如运行中的QQ等
-
线程:是程序的内部的一条执行路径
①若是一个进程同一时间并行执行多个线程,就是支持多线程的
②线程作为调度和执行的单位,每个线程都是拥有独立运行的运行栈和程序计数器,线程切换的开销小
③多个线程共享的系统资源会带来安全隐患
④一个java应用程序java.exe其实至少有是三个线程:main()线程,gc()垃圾回收线程,异常处理线程。如果发生异常会影响主线程 -
创建线程的两个方法
方式一:继承Thread方法
public class MyThread01 extends Thread{
/*
①创建一个继承于Thread类的子类
②重写Thread类的run()
③创建Thread类的子类的对象
④通过调用对象.start()方法
*/
@Override
public void run() {
//线程要执行的代码都在run()方法中调用
//第一个for循环----------事件1
for (int i = 0; i < 1000; i++) {
System.out.println("i = " + i);
}
super.run();
}
}
测试类
public class Test01 {
public static void main(String[] args) {
//事件一
//创建一个线程,但是此时线程为运行起来
MyThread01 myThread01 = new MyThread01();
//此时调用的start方法,告诉线程就可以直接运行了,即去执行run()中的代码
System.out.println("事件一 在另外一个线程中执行");
myThread01.start();
//事件二:在当前main方法主线程中执行
System.out.println("事件二 在main方法主线程中去执行");
for (int j = 0; j < 1000; j++) {
System.out.println("j = " + j);
}
}
}
方式二:实现Runnable接口
public class MyThread02 implements Runnable{
/*
创建线程的第二种方式
1.实现Runnable接口
2.实现run()方法
3.创建一个线程,让线程持有MyRunnable实例
4.启动线程
*/
@Override
public void run() {
//事件一
for (int i = 0; i <1000 ; i++) {
System.out.println("i = " + i);
}
}
}
测试类
public class Test02 {
public static void main(String[] args) {
//1.创建一个Runnable实例
Runnable runnable = new MyThread02();
//2.创建一个线程,持有runnable实例
Thread thread = new Thread(runnable);
System.out.println("事件一 在自定义的MyThread中去执行");
thread.start();
//事件二 在当前main方法主线程中执行
//第二个for循环-------事件二
System.out.println("事件二 在main主线程中执行");
for (int j = 0; j < 1000; j++) {
System.out.println("j = " + j);
}
}
}
5.线程的生命周期
五种状态 :新建,就,运行,阻塞,死亡
1新建:当一个Thread类或者其子类的对象被声明并且创建时,新生的线程对象处于新建的状态
2.就绪:处于新建的状态的线程被Start之后,将进入线程队列,等待CPU时间片,此时它已经具备了运行的条件,但是没有获得CPU的资源
3.运行:当就绪的线程被调用并且获得CPU资源时,便进入了运行状态,run()方法运行了线程的操作和功能
4.阻塞:在某种特殊的情况下,被人为的挂起或者执行输入输出的操作时,让CPU临时的阻止了自己的执行,进入阻塞状态
5.死亡:线程完成了它的全部工作或者是线程被强制性的提前终止或者出现异常情况导致结束
6.线程和进程之间的区别?
进程:一个软件的运行,就会创建一个或者多个进程,进程就是计算机资源的封装(CPU内存,磁盘 网络)
线程:程序执行的基本单位,一个进程是有多个线程组成的,多个线程之间可以共享进程中的计算机资源
-
多线程的优点:
①提高了应用程序的响应,对于图形化的界面更有意义,可以增强用户利用率
②提高计算机系统的CPU利用率
③改善程序的结构,将即长又复杂的进程分为多个线程,独立运行利于理解和修改 -
何时需要多线程?
①程序需要同时执行两个或者多个任务
②程序需要实现一些需要任务的等待,比如用户的输出,文件的读写,网络操作等
③需要一些后台运行的程序等