线程简介【一】

116 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解线程讲解,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

线程

 '什么是进程?什么是线程?
         进程是一个应用程序(1个进程是一个软件)。
         线程是一个进程中的执行场景/执行单元。
         一个进程可以启动多个线程。
     
     '对于java程序来说,当在DOS命令窗口中输入:
         java HelloWorld 回车之后。
         会先启动JVM,而JVM就是一个进程。
         JVM再启动一个主线程调用main方法。
         同时再启动一个垃圾回收线程负责看护,回收垃圾。
         最起码,现在的java程序中至少有两个线程并发,
             一个是垃圾回收线程,一个是执行main方法的主线程。
     
     '进程和线程是什么关系?举个例子
 ​
         阿里巴巴:进程
             马云:阿里巴巴的一个线程
             童文红:阿里巴巴的一个线程
         
         京东:进程
             强东:京东的一个线程
             妹妹:京东的一个线程
         
         进程可以看做是现实生活当中的公司。
         线程可以看做是公司当中的某个员工。
 ​
         注意:
             进程A和进程B的'内存'独立不共享。(阿里巴巴和京东资源不会共享的!)
                 魔兽游戏是一个进程
                 酷狗音乐是一个进程
                 这两个进程是独立的,不共享资源。
 ​
             线程A和线程B呢?
                 在java语言中:
                     线程A和线程B,'堆内存和方法区内存共享。
                     但是'栈内存独立,一个线程一个栈。
             
                 假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,
                 互不干扰,各自执行各自的,这就是多线程并发。
             
             火车站,可以看做是一个进程。
             火车站中的每一个售票窗口可以看做是一个线程。
             我在窗口1购票,你可以在窗口2购票,你不需要等我,我也不需要等你。
             所以多线程并发可以提高效率。
 ​
             java中之所以有多线程机制,目的就是为了提高程序的处理效率。
 ​
     '思考一个问题:
         使用了多线程机制之后,main方法结束,是不是有可能程序也不会结束。
         main方法结束只是主线程结束了,主栈空了,其它的栈(线程)可能还在
         压栈弹栈。
 ​
     '分析一个问题:对于单核的CPU来说,真的可以做到真正的多线程并发吗?
 ​
         对于多核的CPU电脑来说,真正的多线程并发是没问题的。
             4核CPU表示同一个时间点上,可以真正的有4个进程并发执行。
 ​
         什么是真正的多线程并发?
             t1线程执行t1的。
             t2线程执行t2的。
             t1不会影响t2,t2也不会影响t1。这叫做真正的多线程并发。
 ​
         单核的CPU表示只有一个大脑:
             不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。
             对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于
             CPU的处理速度极快,多个线程之间频繁切换执行,跟人来的感觉是:多个事情
             同时在做!!!!!
                 线程A:播放音乐
                 线程B:运行魔兽游戏
                 线程A和线程B频繁切换执行,人类会感觉音乐一直在播放,游戏一直在运行,
                 给我们的感觉是同时并发的。
         
         电影院采用胶卷播放电影,一个胶卷一个胶卷播放速度达到一定程度之后,
         人类的眼睛产生了错觉,感觉是动画的。这说明人类的反应速度很慢,就像
         一根钢针扎到手上,到最终感觉到疼,这个过程是需要“很长的”时间的,在
         这个期间计算机可以进行亿万次的循环。所以计算机的执行速度很快。
     
 'java语言中,实现线程有两种方式,那两种方式呢?
 ​
     java支持多线程机制。并且java已经将多线程实现了,我们只需要继承就行了。
 ​
     第一种方式:编写一个类,直接继承java.lang.Thread,重写run方法。
         // 定义线程类
         public class MyThread extends Thread{
             public void run(){
             
             }
         }
         // 创建线程对象
         MyThread t = new MyThread();
         // 启动线程。
         t.start();
     
     第二种方式:编写一个类,实现java.lang.Runnable接口,实现run方法。
         // 定义一个可运行的类
         public class MyRunnable implements Runnable {
             public void run(){
             
             }
         }
         // 创建线程对象
         Thread t = new Thread(new MyRunnable());
         // 启动线程
         t.start();
     
     注意:第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承
     其它的类,更灵活。
 ​
 '、关于线程对象的生命周期?
     新建状态
     就绪状态
     运行状态
     阻塞状态
     死亡状态

分析

 /*
 大家分析以下程序,有几个线程,除垃圾回收线程之外。有几个线程?
     1个线程。(因为程序只有1个栈。)
 ​
 main begin
 m1 begin
 m2 begin
 m3 execute!
 m2 over
 m1 over
 main over
     一个栈中,自上而下的顺序依次逐行执行!
 ​
  */
 public class ThreadTest01 {
     public static void main(String[] args) {
         System.out.println("main begin");
         m1();
         System.out.println("main over");
     }
 ​
     private static void m1() {
         System.out.println("m1 begin");
         m2();
         System.out.println("m1 over");
     }
 ​
     private static void m2() {
         System.out.println("m2 begin");
         m3();
         System.out.println("m2 over");
     }
 ​
     private static void m3() {
         System.out.println("m3 execute!");
     }
 }
 ​