Java多线程--基础(一)

进程和线程

进程

进程是程序的一次执行,是系统运行程序的基本单位,进程是动态的。每个进程会占用CPU时间,内存空间,文件,输入输出设备的使用权。

线程

线程是比进程更小的执行单位。在一个进程中可以产生多个线程。同类的线程共享一个内存空间和一组系统资源。线程切换的负担比进程小得多,因而也叫轻量级进程。

多线程

多线程就是多个线程同时或者交替运行。单核CPU交替运行,多核CPU可以同时运行。

为什么提倡多线程而不是多进程

线程的切换和调度成本远小于进程。

线程的优缺点

  1. 优点
    可以把处理时间长的任务放到后台处理,发挥多喝处理器的优势,让系统运行更快。
  2. 缺点
  • 降低代码可读性
  • 更多的线程需要更多的内存空间
  • 需要考虑线程安全的问题

多线程中的概念

同步和异步

同步和异步分别形容一次方法调用。

  1. 同步
    调用者必须等待同步方法调用返回才能继续后续操作。
  2. 异步
    异步方法发送开始指令后方法调用会立即返回,调用者可以继续后续操作。

并发和并行

  1. 并发
    并发是指在宏观上多个任务同时进行,在CPU中其实是交替执行的。
  2. 并行
    并行是指多个任务就是同时进行的,在多核CPU中可以实现。

临界区

每次只能被一个线程(进程)访问的共享资源或变量。

阻塞和非阻塞

非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而回立刻返回,阻塞与之相反。

创建线程的方式

继承Thread类

public class MyThread extends Thread {
      @Override
      public void run() {
            super.run();
            System.out.println("MyThread");
      }
}

实现Runnable接口

public class MyRunnable implements Runnable {
      @Override
      public void run() {
            System.out.println("MyRunnable");
      }
}

线程池

在实际开发中,建议使用线程池创建线程。

public class ThreadPool {
      private static int POOL_NUM = 10;
      public static void main(String[] args) {
            ExcutorService excutorService = Excutors.newFixedThreadPool(5);
            for(int i = 0; i < POOL_NUM; i++) {
                  RunnableThread thread = new RunnableThread();
                  excutorService.excute(thread);
            }
      }
}

class RunnableThrad implements Runnable {
      private int THREAD_NUM = 10;
      public void run() {
            for(int i = 0; i < THREAD_NUM; i++) {
                  System.out.println("线程" + Thread.curretThread() + " " + i);
            }
      }
}

线程的生命周期

线程状态

  1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
    线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。
  3. 阻塞(BLOCKED):表线程阻塞于锁。
  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
  5. 超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。
  6. 终止(TERMINATED):表示该线程已经执行完毕。

线程的优先级

  • 通过setPriority()方法设置线程优先级
  • java中线程优先级的范围是1~10
  • JDK中使用3个常量预定义优先级
  1. MIN_PRIORITY = 1
  2. NORM_PRIORITY = 5
  3. MAX_PRIORITY = 10

线程优先级的特性

  1. 继承性
    A线程启动B线程,A和B的线程优先级相同
  2. 规则性
    高优先级的线程总是大部分先执行完
  3. 随机性
    优先级高的线程不一定每次都先执行完。
posted @ 2020-09-08 22:03  来一块小饼干  阅读(83)  评论(0编辑  收藏  举报