一、程序、进程、线程简介

  1. 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象

  2. 进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期

    • 如:运行中的QQ,运行中的MP3播放器
    • 程序是静态的,进程是动态的
    • 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
  3. 线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。

    • 若一个进程同一时间并行执行多个线程,就是支持多线程的

    • 线程作为调度和执行的单位每个线程拥有独立的运行栈程序计数器(pc)线程切换的开销小

      1. 栈和程序计数器,每个线程各自有一套
      2. 方法区、堆一个进程一份,一个进程里面有个多个线程,这也就意味这,多个线程共享方法区和堆。

  • 一个进程中的多个线程共享相同的内存单元/内存地址空间它们从同一堆中分配对象,可以访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患。

二、并行与并发

并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。

并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事。

三、线程的创建方式一 【继承Thread类】

  1. Thread类的特性。

    • 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体。
    • 通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。【直接调动run方法不是多线程】
  2. Thread类构造器

    • Thread():创建新的Thread对象
    • Thread(String threadname):创建线程并指定线程实例名
    • Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
    • Thread(Runnable target, String name):创建新的Thread对象
  1. 继承Thread类的实现步骤

    (1)定义子类继承Thread类。

    (2)子类中重写Thread类中的run方法。

    (3)创建Thread子类对象,即创建了线程对象。

    (4)调用线程对象start方法:启动线程,调用run方法。

    public class ThreadTest {
    public static void main(String[] args) {
    MyThread myThread = new MyThread();
    myThread.start(); // 启动线程
    for (int i = 0; i < 300; i++) {
    if (i % 2 != 0) {
    System.out.println("main:"+i);
    }
    }
    }
    } class MyThread extends Thread {
    @Override
    public void run() { // 重写run方法
    for (int i = 1; i < 101; i++) {
    if (i % 2 == 0) {
    System.out.println(i+" ");
    }
    }
    } }
  2. Thread类的有关方法

    • void start():启动线程,并执行对象的run()方法 run():线程在被调度时执行的操作
    • String getName():返回线程的名称
    • void setName(String name):设置该线程名称
    • static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
    • static void yield():线程让步
      • 暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
      • 若队列中没有同优先级的线程,忽略此方法
    • join():当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完为止
      • 低优先级的线程也可以获得执行
    • static void sleep(longmillis):(指定时间:毫秒)
      • 令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队
      • 抛出InterruptedException异常
    • stop():强制线程生命期结束,不推荐使用
    • booleanisAlive():返回boolean,判断线程是否还活着

四、线程的调度

  1. cpu的调度策略:
  • 时间片

  • 抢占式:高优先级的线程抢占CPU

  1. Java的调度方法:
  • 同优先级线程组成先进先出队列(先到先服务),使用时间片策略
  • 对高优先级,使用优先调度的抢占式策略
  1. 线程的优先级

MAX_PRIORITY:10

MIN_PRIORITY:1

NORM_PRIORITY:5

涉及的方法:

  • getPriority():返回线程优先值
  • setPriority(intnewPriority):改变线程的优先级

说明:

  • 线程创建时继承父线程的优先级
  • 低优先级只是获得调度的概率低,并非一定是在高优先级线程之后才被调用

五、线程的创建方式二 【方式二:实现Runnable接口】

  1. 定义子类,实现Runnable接口。
  2. 类中重写Runnable接口中的run方法。
  3. 通过Thread类含参构造器创建线程对象。
  4. 将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
  5. 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
public class RunnableTest {
public static void main(String[] args) {
RunTest runTest = new RunTest(); // new 一个实例对象
Thread thread = new Thread(runTest); // 把实例对象传入Thread的构造器中。
thread.start(); // 开启线程
}
} class RunTest implements Runnable{ // 实现Runnable接口
@Override
public void run() {
for (int i = 0; i < 101; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
}

六、比较创建线程的两种方式

  1. 开发中:优先选择——实现Runnable接口的方式

  2. 原因:

    • 实现的方式没有类的单继承性的局限性
    • 实现的方式更适合来处理多个线程有共享数据的情况
      • 因为多个线程使用的是同一个对象。
      • 即不用加static关键字,即可处理数据共享。
  3. 联系:

    • Thread 类也实现了Runnable接口
    • 两中方式都需要重写run(),将线程的要执行的逻辑声明在run()中

java 多线程-1的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. .Net 桌面程序(winform,wpf,跨平台avalonia)打安装包部署到windows 入门

    .Net 桌面程序(winform,wpf,跨平台avalonia)部署到windows 入门 本文以为avalonia为例,用Setup Factory 将.Net桌面程序(winform,wpf, ...

  2. ASP.NET Core 奇技淫巧之接口代理转发

    前言 先讲讲本文的开发背景吧.. 在如今前后端分离的大背景下,咱的客户又有要求啦~ 要前后端分离~ 然因为种种原因..没办法用用纯前端的框架(其实是学习成本高,又没钱请前端开发人员)... 所以最终决 ...

  3. windows下mongoDB的下载和安装

    1.进入mongoDB官网,官网地址:https://www.mongodb.com 2.  点击Try free按钮,进入下载页面 3.点击download进行下载:下载完成如下图: 4.点击下载的 ...

  4. Javascript之其实我觉得原型链没有难的那么夸张!

    原型链.闭包.事件循环等,可以说是js中比较复杂的知识了,复杂的不是因为它的概念,而是因为它们本身都涉及到很多的知识体系.所以很难串联起来,有一个完整的思路.我最近想把js中有点意思的知识都总结整理一 ...

  5. Istio Routing 实践掌握virtualservice/gateway/destinationrule/AB版本发布/金丝雀发布

    原文 在学习像 Istio 这样的新技术时,看一下示例应用程序总是一个好主意. Istio repo 有一些示例应用程序,但它们似乎有各种不足. 文档中的 BookInfo 是一个很好的示例. 但是, ...

  6. 手把手教你写VueRouter

    Vue-Router提供了俩个组件 `router-link` `router-view`, 提供了俩个原型上的属性`$route` `$router` ,我现在跟着源码来把它实现一下 开始 先看平时 ...

  7. 获取到jqgrid发送的请求得到的数据

    loadComplete: function (data) { console.log(data); }, 例: var jgGrid = $("#jgTable").jqGrid ...

  8. apache+djnago+websocket 部署配置

    部署Apache服务器 1.apache服务的安装这里不做赘述,因为网上一大堆. 链接:https://blog.csdn.net/qq_24394093/article/details/905501 ...

  9. keil5 使用JLink 向nrf52840DK 下载程序出现No Cortex-M SW Device Found

    今天打开52840 keil5 工程,下载程序无法下载成功,提示如下: 在Jlink 配置中(Option for target....-> Debug->Setting )SWDIO也无 ...

  10. Linux系统添加应用服务进程的守护进程

    以前曾在Linux上维护应用服务,但是只是简单的迭代版本等工作,没有什么技术含量.最近部署在Linux服务器上的一个平台的总线进程broker(下面总线用broker指代)经常挂掉,由于总线负责服务之 ...