zoukankan      html  css  js  c++  java
  • 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. 随机性
      优先级高的线程不一定每次都先执行完。

    作者:lykxbg —— 来一块小饼干

    出处:http://www.cnblogs.com/lykxbg/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    第11组 团队Git现场编程实战
    团队项目-需求分析报告
    团队项目-选题报告
    第10组 Alpha事后诸葛亮
    第10组 Alpha冲刺(6/6)
    第10组 Alpha冲刺(5/6)
    第10组 Alpha冲刺(4/6)
    第10组 Alpha冲刺(3/6)
    第10组 Alpha冲刺(2/6)
    第10组 Alpha冲刺(1/6)
  • 原文地址:https://www.cnblogs.com/lykxbg/p/13635973.html
Copyright © 2011-2022 走看看