一、进程和线程
1.进程
是一个程序的运行状态和资源占用的描述

进程的特点:
a.独立性:不同的进程之间是独立的,相互之间资源不共享
b.动态性:进程在系统中不是静止不动的,而是一直活动的
c.并发性:多个进程可以在同一个处理器上同时进行,互不影响

多进程:一个操作系统可以运行多个应用程序

2.线程
线程是进程的组成部分,一个进程可以有多个线程,每个线程用来处理一个指定的子任务

举例:打开酷狗软件-------》这是一个进程
播放歌曲/刷新歌词------》两个线程(并发的)

线程的执行是抢占式的,多个线程可以在一个进程中并发执行,其实质是CPU在不同的线程之间进行快速的切换,也就是说,当前运行的线程在任何时候都有可能被挂起,以便于别的线程去执行对应的任务,同样的,被挂起的线程随时有可能争抢到时间片,继续执行

多线程:在一个进程中,多个线程同时进行
应用:一个浏览器可以同时下载多张图片
一个服务器可以同时响应多个用户请求

3.进程和线程之间的关系
a.一个程序运行后至少有一个进程
b.一个进程可以包含多个线程,但至少需要有一个线程,否则进程是没有意义的

为什么要选用多线程编程而不选用多进程呢?/线程相对于进程的优点?
a.进程间资源不能进行共享,但是线程之间可以共享资源
b.系统如果要创建进程的话,需要为这个进程重新分配系统资源,而创建线程的话则相对容易的多,因此使用线程处理并发任务比进程的效率高
c.Java中内置了多线程的功能支持,简化了多线程编程

二、线程的实现
1.继承自Thread类
Thread类是所有线程类的父类,实现了对线程的抽取和封装
1>使用Thread类创建并开启线程的步骤:
a.定义一个类,继承自Thread类,重写该类的run方法,该run方法的方法体就代表了线程需要完成的任务,因此,run方法体也被称为线程执行体
b.创建子类的对象,即相当于创建了一个线程
c.需要使用start方法手动开启线程

关于线程的执行,需要注意的问题:
a.如果一个线程中的所有的任务都处理完了,那么这个线程会自动停止(正常情况)
b.如果在一个线程a中开辟了子线程a0,a1,a2.....那么线程a停止后,在这个线程中开辟的子线程会全部停止
c.多个线程并发执行,其实就是在争抢CPU时间片

2.实现接口Runnable
使用实现Runnable接口的方式创建并开启线程的步骤:
a.定义一个类,这个类实现Runnable接口,需要重写对应的run方法,run方法的方法体同样是线程的执行体
b.创建实现了Runnable接口对应类的对象,并以此实例作为Thread类的target对象
c.手动调用start方法开启线程

两种方式实现线程的比较:
1.实现Runnabel接口
a.自定义的类只是实现了Runnable接口,同时还可以去继承其他的类
b.多个线程可以共享同一个target对象,所以非常适合多个相同的线程来处理同一份资源的情况
弊端:不直观,如果要获取当前正在运行的线程,只能通过Thread.currentThread()
2.继承Thread类
直观,如果要访问正在运行的线程,除了可以通过Thread.currentThread()方式之外,还可以使用super关键字

弊端:因为线程类已经继承了Thread类,所以不能再去继承其他的类(单继承)

实际上,大多数的多线程应用都采用实现Runnable接口的方式实现(推荐使用匿名内部类)

三、线程的生命周期
对象的生命周期:从一个对象被实例化到这个对象被销毁的过程中,这个对象经历的种种状态

举例:人的生命周期:出生---婴儿---儿童---少年---青年----中年---老年---死亡

对于线程,当一个线程被创建并启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,同样的也会经历各种过程(在一个进程中,多个线程可以并发,争抢CPU时间片)

New(新生):线程被实例化,但是还没有开始执行
Runnable(就绪):没有争抢到时间片
Running(运行):争抢到了时间片,开始执行线程中的任务
Blocked(阻塞):线程再执行的过程中遇到突发状况,使得其他的线程争抢去了时间片,被阻塞的线程会等待合适的时机重新进入就绪状态
Dead(死亡):线程终止
a.run方法执行完毕,线程正常结束
b.直接调用该线程的stop方法强制终止这个线程(这种做法比较危险,死锁)

四、线程的常用方法
1.设置线程的优先级
可以通过设置优先级来改变线程抢到时间片的概率,优先级高的线程抢到时间片的概率比较高,可以获得更多的执行机会

默认情况下,每个线程的优先级都与创建它的的父线程具有相同的优先级
setPriority(),所传的参数范围1~10,默认为5,对应的数值越大,说明优先级越高,这个方法的设置一定要在start之前

2.使得线程休眠
使得当前正在执行的线程休眠一段时间,释放时间片,导致线程进入阻塞状态
sleep(5000);5000代表的是毫秒
设置了sleep就相当于将当前线程挂起5s,这个操作跟线程的优先级无关,当对应的时间到了之后,还会再执行,
如果只设置了优先级的话,等于给设置了优先级的线程设置冲突,那么被挂起的是优先级比较低的那个线程

3.中断线程
interrupt()
interrupt只是改变一个线程的状态,并不是真正的停止一个线程
如果线程处于阻塞状态(sleep,join),则中断状态被清除
如果一个线程没有处于阻塞状态,这时调用interrupt将不起作用,否则,会引起InterruptedException异常(该线程预先准备好处理此状况)

实际看到的效果:停止了线程

在线程的执行体中,可以通过 boolean isInterrupted() 来测试线程是否已经中断。

4.线程合并
join()
优先执行被合并进来的线程,执行完合并进来的线程之后,再执行原来的线程

5.后台线程
setDeamon()
又被称为守护线程或者精灵线程
特征:如果所有的前台线程都死亡,后台线程会自动死亡

这个方法的调用需要在start之前

6.线程让步
yield()
yield方法是一个和sleep方法相似的方法
它可以让当前正在执行的线程暂停,但他不会阻塞该线程,它只是将该线程转入就绪状态,完全会出现的一个情况是:当某个线程调用了yield方法暂停之后,线程调度器可能会将该线程立马调起来进入执行状态
实际上,只有优先级相同或者优先级更高的线程才有可能获取执行的机会

yield方法和sleep方法的区别:
a.sleep方法暂停当前线程之后,会给其他线程执行的机会的,但是跟线程的优先级没有关系,yield只有优先级相同或者优先级更高的线程才有可能获取执行的机会
b.sleep会将一个线程转入阻塞状态,但是yield不会,只是做出了让步
c.sleep会有InterruptedException的异常,但是yield没有
d.sleep可以有更好的可移植性,通常不要依靠yield来控制并发的线程

JAVA基础知识总结:十八的更多相关文章

  1. Java基础知识陷阱(十)

    本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...

  2. Java基础知识➣面向对象(八)

    概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...

  3. Java基础知识笔记(八:集合类)

    目录 1  集合类简介  2  List介绍及简单使用 2.1  LinkedList介绍及简单使用 2.2  ArrayList介绍及简单使用 2.3  Vector介绍及简单使用 2.3.1  S ...

  4. Java基础知识学习(八)

    IO操作 5个重要的类分别是:InputStream.OutStream.Reader.Writer和File类 面向字符的输入输出流 输入流都是Reader的子类, CharArrayReader ...

  5. JAVA基础知识总结:八

    面向对象语言的三大特性;封装.继承.多态 一.面向对象语言特性之封装 1.什么是封装? 一个类中某些属性,如果不希望外界直接访问,我们可以将这个属性作为私有的,可以给外界暴露出来一个访问的方法 使用封 ...

  6. Java基础学习笔记十八 异常处理

    什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在 ...

  7. Java基础笔记(十八)——多态

    多态表示同一个操作作用在不同对象时,会有不同的结果. 多态可分为编译时多态和运行时多态. 编译时多态:方法重载,编译时就可以确定到底调用哪个方法,可以被看做一个类中的方法多态性. 运行时多态:只有在运 ...

  8. Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)

    一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...

  9. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  10. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

随机推荐

  1. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  2. Lyft高管的技术团队管理实战

    Lyft 的技术总监沈思维分享了他对于管理技术团队和打造工程文化的经验,也欢迎添加他的微信公众号"人家的屋顶"了解更多(微信公众号ID: othersroof).沈思维毕业于密歇根 ...

  3. cannot_delete_plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbit@iZbp1iiexwyqe7tpjigcg9Z-plugins-expand"

    [root@iZbp1iiexwyqe7tpjigcg9Z rabbitmq]# cat startup_err /usr/lib/rabbitmq/bin/rabbitmq-env: line 91 ...

  4. linux日常管理

    1.压缩和解压 tar压缩tar -czf hxl_product.tar.gz ./product tar解压tar -xzvf hxl_app.tar.gz z选项会将该压缩文件直接解压到目录,要 ...

  5. (3网络化部署)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署

    我们使用google提供的colab,对我们现有的GoNetwork进行适当修改,利用网络资源进行运算. 一.什么是 Colaboratory? Colaboratory 是一款研究工具,用于进行机器 ...

  6. 20145319 《计算机病毒》动态分析lab3-2

    20145319 <计算机病毒>动态分析lab3-2(实践六) 实践过程 基础分析 拿到恶意代码时,首先使用PE ID打开,查看其中一些基础信息以及观察该恶意代码是否加壳,来确定下一步分析 ...

  7. 赞 ( 84 ) 微信好友 新浪微博 QQ空间 180 SSD故事会(14):怕TLC因为你不了解!【转】

    本文转载自:https://diy.pconline.com.cn/750/7501340.html [PConline 杂谈]从前,大家谈TLC色变:如今,TLC攻占SSD半壁江山.是的,这个世界就 ...

  8. dart实例

    import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends S ...

  9. Flutter 第一次运行就出现白屏的问题

    --enable-software-rendering 解决办法: 顶部菜单找到 run-->Edit Configurations 中加这么一句:

  10. Python 必备好库 - 好工具收藏

    apscheduler collections collections.OrderDict collections.defaultdict Python 标准库提供了 collections 模块.这 ...