java基础| 多线程基础一:并发编程基础

  • 基本概念

进程:是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程一般由程序数据集合进程控制块三部分组成。(程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。

    进程具有的特征:

  1. 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  2. 并发性:任何进程都可以同其他进行一起并发执行;
  3. 独立性:进程是系统进行资源分配和调度的一个独立单位;
  4. 结构性:进程由程序,数据和进程控制块三部分组成

线程:线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID当前指令指针PC寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。

  • 进程和线程的关系

    一个操作系统运行着很多个程序也就有很多个进程,而其中一个进程中可能包含着多个线程(大部分程序都是多线程程序)。当线程数为1的时候,进程和线程其实没有什么很大的区别,只是概念上的区别。此外,进程:是操作系统对CPU的抽象,是操作系统分配资源的基本单位 。线程:是操作系统在进程基础上的又一次抽象,是操作系统调度的基本单位。

                                                                                         进程和线程之间的关系图

为什么要采用多线程?

  1. 线程是并行实体,共享同一个地址空间和全部数据的能力,这是多进程模型没有的。
  2. 线程比进程更轻量级,比进程更easy(更快)创建和撤销,在有大量线程须要修改和高速修改时,这一特性是十分重要的。
  3. 若多个线程都是CPU密集型的。多线程那么并不能获得性能上的增强。可是假设存在着大量的计算和大量的I/O处理,拥有多个线程同意这些活动彼此重叠进行从而会加快应用程序运行的速度;
  4. 多线程系统使得真正的并行有了实现的可能,提高了CPU利用率(充分利用了CPU的性能)。

小结:进程是程序运行资源分配的最小单位 ;线程是 CPU 调度的最小单位,必须依赖于进程而存在 ;线程无处不在

  • 上下文切换

    CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换

(即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms))。

  • 并行和并发的区别

并发:指应用能够交替执行不同的任务,比如单 CPU 核心下执行多线程并非是同时执行多个任务。

并行:指应用能够同时执行不同的任务

总结:并发是交替执行,并行是同时执行。

并发编程需要注意的问题?

  1.     安全性问题
  2.     活跃性问题(饥饿,死锁)
  3.     性能问题(无限创建线程导致服务器资源耗尽从而宕机)
  • Java中创建线程的四种方法

继承Thread类。

public class MyThread extends Thread {
    @Override 
    public void run() { 
        for (int i = 0; i < 10; i++) { 
            System.out.println(getName()+":正在执行!"+i); 
        } 
    }
}

实现Runnable接口

public class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
        for (int i=0;i<20;i++){ 
            System.out.println(Thread.currentThread().getName()+" "+i); 
        } 
    } 
}
实现 Callable 接口
public class MyCallable implements Callable<String> { 
    @Override 
    public String call() throws Exception { 
        System.out.println("====="); 
        return "results"; 
    } 
}

FutureTask<String> ft = new FutureTask<>(new MyCallable()); 
new Thread(ft).start();
Lambda 表达式
public class LambdaThread { 
    public static void main(String[] args) { 
        new Thread(() -> System.out.println("Lambda表达式任务执行!"))
            .start(); // 启动线程
    } 
}
  • ThreadRunnable的区别
    如果一个类继承 Thread ,则不适合资源共享。但是如果实现了 Runable 接口的话,则很容易的实现资源共享;实现Runnable 接口比继承 Thread 类所具有的优势:
  1. 适合多个相同的程序代码的线程去共享同一个资源。
  2. 可以避免java中的单继承的局限性。
  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  4. 线程池只能放入实现RunableCallable类线程,不能直接放入继承Thread的类。
  • 对线程的一些理解
run 只是 Thread 里面的一个普通方法, start 是启动线程的方法。 同一个线程可以多次调用run ,不能多次调用start。( 只调用run方法不调用start方法则就是一个当前线程的普通调用,不会创建新线程 )
  • 结束线程的三种方法
使用退出标志: run 方法执行完后,线程就会退出。但有时 run 方法是永远不会结束的,如在服务端程序中使用线程进 行监听客户端请求,或是其他的需要循环处理的任务。也就是说通过一个变量控制线程中断。
使用 stop() 方法强行终止线程: java.lang.Thread 类型提供了一系列的方法如 start() stop() resume() suspend() destory()等方法来管理线程。 但是这个方法是不安全的,而且该方法已被弃用,最好不要使用它。原因: 此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。导致数据得不到同步,出现数据不一致的问题。

使用 interrupt 方法: 线程内部有个中断标志,当调用线程的 interrupt() 实例方法之 后,线程的中断标志会被置为 true ,可以通过线程的实例方法 isInterrupted() 获取线程的中断标志。
  • sleep()方法和yield() 方法
sleep() 的作用是让当前线程休眠(正在执行的线程主动让出 cpu ,然后 cpu 就可以去执行其他任务),即当前线程会从“ 运行状态 进入到 休眠(阻塞)状态 sleep() 会指定休眠时间,线程休眠的时候会大于或者等于该休眠时间,当时间过后该线程重新被会形式,他会由“ 阻塞状态 编程 就绪状态 ,从而等待cpu 的调度执行,注意: sleep方法只是让出了cpu 的执行权,并不会释放同步资源锁
yield() 方法: 礼让线程:表示当前线程对象提示调度器自己愿意让出 CPU 资源 调用该方法后,线程对象进入就绪状态,所以完全有可能:某个线程调用了 yield() 方法,但是 线程调度器又把它调度出来重新执行
  • join()方法
( 插队 ) 联合线程:表示这个线程等待另一个线程完成后(死亡)才执行, join 方法被调用之后,线程对象处于阻塞状态。写在哪个线程中,哪个线程阻塞。例如thread1中加入thread2.join()则thread1一直等到thread2运行结束后才继续运行
  • 线程的运行周期
 线程运行生命周期


                                                                                                                   
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值