[黑马程序员]--线程基础知识小结

时间:2021-09-27 00:47:35

------- android培训java培训、期待与您交流! ----------

1,线程的概念

1 什么是进程?
  当前正在运行的程序!


2 OS为每个进程分配内存
每个进程都有自己独立的内存空间
进程之间不能共享数据


3 进程的代码谁来执行
进程中,可以理解为有很多的代码,执行代码的叫线程!
如果一个进程中有多个执行的轨迹,那么就是同时有多个线程在执行代码。
这样的程序叫多线程程序!


4 进程中同时执行的多个任务
  多线程


5 把人看做是一个进程
人如果是一个进程,那么人也是多线程的
因为人可以一边走路,一边听歌,还可以一边吃东西。


6 线程的概念
  进程在执行过程中,可能需要多个任务同时执行,每个任务的执行者就是线程。线程就是进程中的一个执行控制单元。


7 没有线程的进程
  不存在,怎么也要有一个线程。


8 多线程的用途
同时执行多个任务,可以提高效率。
可以完成多个任务并发的效果。


9 理解线程(人和任务)
人:是执行任务的人,即线程;
任务:线程要执行的任务就是,这里说的任务,通常用一个方法表示。


10 JVM需要运行我们的主线程,还有垃圾回收器
  JVM是多线程的!


11 线程是部分,进程是整体
线程是部分,而进程整体。
部分不能单独存在,线程不能单独启动,只有进程启动后线程才可以启动。
一个进程中的多个线程,可以共享这个进程的数据。


12 需要使用Java API中的线程类(Thread)
  我们需要使用 Thread类来创建线程。


2,多线程概述


1 多个进程同时运行是假的!多个线程同时运行也是假的!
  理解:多个线程就好比需要通电才能运行的多个机器人!但我们只能一个电源,这个电源就是CUP。


2 线程的随机性,以及时间分片
线程的运行时间分派由 CPU来决定,如果多有多个线程,那么CPU也不会有顺序的去执行它们,而是随机的。
当一个线程运行一段时间之后,应该主动阻塞,这样CPU就会把资源分派给其他线程。如果线程不合作,自己不主动阻塞,那么CPU会在一段时间之后强行停止这个线程的运行,把资源分派给其他线程。
CPU会为每个线程都指定一个时间分片,当时间片用完时,线程还不阻塞,那么就强行停止它。


3 多核CPU的不同
多核CPU就相当于是多个CPU,那么与上面说的效果就不太一样了。




4 同一个多线程程序多次运行,结果可能不一样
  因为线程的随机性。


5 主线程结束时,JVM是否结束
   No,只有所有线程都结束了,JVM才会线程。


6 多线程程序的调用栈
  每个线程都有自己的调用栈,都有自己的执行轨迹!


7 当某个线程出现异常时
异常不能跨线程。
如果是main抛出了异常,那么主线程会终止,但其他线程不会终止。
如果t1线程抛出了异常,那么t1终止,而main不会终止。
 
 

3,创建线程的两种方法

|--1. 继承 Thread

|--历程如下

public class ThreadDemo1 {
  public static void main(String[] args) throws InterruptedException {
    Thread th = new MyThread();//创建线程类的对象,自己有任务的线程。
    th.start();//启动线程
    for(int i = 0; i < 10; i++) {
     System.out.print("a");
     Thread.sleep(200);//让当前程序休眠100毫秒
    }
  }
}

class MyThread extends Thread {
  public void run() {
    for(int i = 0; i < 10; i++) {
     System.out.print("b");
     try {
       Thread.sleep(200);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }//让当前程序休眠100毫秒
    }  
  }
}


|--2. 实现 Runnable

|--历程如下

public class RunnableTest
{
  public static void main(String[] args){
    PrintA pa = new PrintA();
    Thread tr = new Thread(pa);
    tr.start();
    for(int i =0;i<10;i++){
     System.out.println("b");
    }
  }
}

class PrintA implements Runnable
{
    public void run(){
     for(int i=0;i<10;i++){
       System.out.println("a");
     }
    }
}