本文已参与「新人创作礼」活动,一起开启掘金创作之路。
进程与线程概念
进程:是系统中一个正在运行的程序实体;进程是系统进行资源分配和调度的基本单位;
线程:是进程中运行的实际工作单位; 线程是系统进行运算调度和资源分配的最小单位;
关系: 进程是线程的容器;一个进程中可以并发多个线程,每条线程并行执行不同的任务;一个进程的多个线程共享进程的资源。
线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆、栈。
线程的五种状态
Java中线程生命周期分为新建(New)、运行(Runnable)、阻塞(Blocked)、无限期等待(Waiting)、有限期等待(Time Waiting)和结束(Terminated)这6种状态。
线程状态方法
wait() 与 sleep()
sleep是Thread类的方法,会使线程阻塞、让出CPU,但是不释放锁。
wait()是Object类的方法,会使线程阻塞、让出CPU,同时会释放锁;当前线程必须拥有对象的锁才可调用该方法;必须调用notify/notifyAll方法唤醒,(notify是随机唤醒)。
yield() 就绪状态
使线程暂停、让出 CPU ,但不是阻塞线程,而是将线程转入就绪状态;其他线程可能获得CPU,这个线程也可能获得CPU。
join()
阻塞本线程等到指定线程完成以后再继续执行。
例如:在线程 B 中调用了线程 A 的 Join()方法,直到线程 A 执行完毕后,才会继续执行线程 B。
多线程的使用
创建线程的方式
继承 Tread 类、实现 Runnable 接口、实现 Callable 接口、使用线程池
Runnable和Tread比较
Tread:在继承的子类中重写run()方法,使用自己对象的start()方法启动线程
多个线程分别使用各自对象的资源,资源不互通,一对一执行任务。
Runnable:在实现类中重写run()方法,使用代理类Tread对象的start()方法启动线程
多个线程同时使用一个实现类对象的资源,资源共享,一对多执行任务。
Runnable 和 Callable 比较
Callable可使用call()获得返回值、可以抛出异常。
Runnable 没有返回值、不可以抛出异常,启动的线程将独立运行并调用该对象的run()方法。
简述线程通信的方式
- volatile 关键词修饰变量,保证所有线程对变量访问的可见性和有序性。
- synchronized关键词。确保多个线程在同一时刻只能有一个处于方法或同步块中。
- wait/notify方法
- IO通信
- Lock 锁的 newContition()方法返回 Condition 对象,Condition 类也可以实现await()等待/signal()通知