线程

 

1. 什么是进程?什么是线程?

进程是一个应用程序(一个进程是一个软件),线程是一个进程中的执行场景/执行单元,一个进程可以启动多个线程。

对于Java程序来说,当在DOS命令窗口输入:Java HelloWorld回车换行之后会启动JVM,而JVM就是一个进程。JVM在启动一个主线程调用main方法。同时在启动一个垃圾回收线程负责看护,现在的Java程序中至少有两个线程并发,一个是垃圾回收线程,一个执行main方法的主线程。

2. 进程和线程之间的关系

例:

阿里巴巴:进程

马云:阿里巴巴的一个线程

童文红:阿里巴巴的一个线程

注意:

进程A和进程B的内存独立不共享。(阿里巴巴和京东资源不共享)

线程A和线程B,堆内存和方法区内存共享

但是栈内存独立,一个线程和一个栈。

java中之所以有多线程机制,目的是为了提高程序的处理效率

main方法结束只是主线程结束了,主栈空了,其它的栈可能还在压栈弹栈

 

3. 堆和方法区共享栈独立

 

4.多线程并发的理解

image-20200613152525813

4. 实现线程的第一种方式

image-20200613155127645

image-20200613155202185

5.run和start的区别

image-20200613161600357

image-20200613161457100

6. 实现线程的第二种方式

image-20200613163214587

image-20200613163346908

 

6.1 采用匿名内部类方式实现

image-20200613175321119

7. 线程的生命周期

新建状态、就绪状态、运行状态、阻塞状态、死亡状态

image-20200614103615614

8. 获取线程的名字

image-20200613192917965

9. 获取当前对象

image-20200613194327449

10. 线程的sleep方法

 

image-20200613195248666

image-20200613195312588

11. 终止线程的睡眠

image-20200614085336587

image-20200614085407798

12. 合理的终止一个线程

image-20200614092843577

image-20200614092951528

image-20200614093057854

image-20200614093155600

13. 线程调度

13.1 线程调度概述

image-20200614094742828

13.2 线程调度方法

image-20200614100000837

14. 线程安全

image-20200614111026713

####    14.1 举例

image-20200614111212356

#### 14.2 如何解决线程安全

image-20200614111616942

14.3 同步和异步的理解

image-20200614112007104

15. 同步代码块synchronized

线程同步机制的语法是:

synchronized(){

编程同步代码块

}

synchronized后面小括号中传的这个“数据“,是多线程共享的数据。才能达到多线程排队

image-20200614154441292

image-20200614160402301

16. Java中的三大变量

image-20200614172108006

17. synchronized的三种写法

image-20200614174557797

18. 死锁概述

public class Test01 {
  public static void main(String[] args) {

      Object o1 = new Object();
      Object o2 = new Object();
      Thread t1 = new Mythread1(o1,o2);
      Thread t2 = new Mythread2(o1,o2);

      t1.start();
      t2.start();
  }
}
class Mythread1 extends Thread{
  Object o1;
  Object o2;
  public Mythread1(Object o1,Object o2){
      this.o1=o1;
      this.o2=o2;
  }
  @Override
  public void run() {
          synchronized (o1){
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              synchronized (o2){

              }
          }
  }
}
class Mythread2 extends Thread{
  Object o1;
  Object o2;
  public Mythread2(Object o1,Object o2){
      this.o1=o1;
      this.o2=o2;
  }
  @Override
  public void run() {
      synchronized (o2){
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          synchronized (o1){

          }
      }
  }
}

19. 开发中如何解决线程安全问题

image-20200615101213763

20. 守护线程概述

image-20200615104136389

public class Test06 {
  public static void main(String[] args) {

      Thread t1 = new Mythread6();
      t1.setName("备份数据系统");
      //启动线程之前将线程设置为守护线程
      t1.setDaemon(true);
      t1.start();
      for (int i = 0; i < 10; i++) {
          System.out.println(Thread.currentThread().getName()+"主线程"+i);
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }
}
class Mythread6 extends Thread{
  @Override
  public void run() {
      int i = 0;
      //即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止
      while (true){
          System.out.println(Thread.currentThread().getName()+"--->"+(++i));
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }
}

21. 实现定时器

image-20200615111728249

22. 实现线程的第第三种方式

image-20200615161151077

image-20200615161248576

image-20200615161327953

 

23.生产者和消费者模式

image-20200615163843735

 

posted @ 2020-06-16 20:10  小白阿乐  阅读(138)  评论(0)    收藏  举报