本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.

转载请注明 出自 : luogg的博客园 谢谢配合!

线程

程序、进程、线程的概念

  • 程序:我们用程序设计语言编写的静态代码
  • 进程:进程是程序的一次执行,是动态的概念,每个程序载入内存中运行就产生一个进程,进程独占系统资源,所谓的多进程指的是可以有多个程序同时执行
  • 线程:线程是比进程更小的执行单位,一个程序中运行的多个任务,多个线程共享所在进程的资源(一个进程可以包含一个或多个线程,一个进程至少要包含一个线程,例如:主线程 main)。

例如:
我们每个人就是一个多线程的对象,想想看,我们可以边吃饭边看电视,同时还要呼吸、心跳等,在同一时间内可以做几件事情,

线程的两种创建方式

  1. 继承Thread类

    • 创建类继承 Thread 类
    • 复写 run 方法(想要同时执行代码)
    • 激活线程类或启动线程类 start()
  2. 实现Runnable接口
    • 创建类实现 Runnable 接口
    • 复写 run 方法(想要同时执行代码)
    • 激活线程类或启动线程类 start()

线程的两种创建方式对比

继承: 继承的同时默认的也实现了Runnable接口
实现的方式优于继承的方式 , 1, 避免了单继承的局限性 2, 如果多个线程要操作同一份数据(或资源), 更适合用实现的方式

线程的常用方法

start();新建的线程进入runnable状态
sleep();
run();
getName();获取线程名称
setName();
currentThread()调取当前线程
join(); 在a线程中调用B线程的join方法
isAlive
getPriority() 获取线程优先级 默认5 1,10
setPriority

Object中的方法

wait 等待
notify 通知,用于线程通信
notifyAll 通知所有线程

使用多线程优点

1, 提高应用程序的响应
2, 提高计算机cpu的利用率
3, 改善程序结构

线程的生命周期

1,新建 new
2,就绪 start
3,运行
4,阻塞
5,死亡

线程的安全问题

由于一个线程在操作共享数据过程中, 未执行完的情况下, 另外的线程参数进来, 导致了共享数据存在了安全问题

如何解决线程的安全问题

必须让一个线程操作共享数据完了之后,其他线程才有机会参与线程数据共享

java实现线程的安全

1,同步代码块

慎用tihs原因: 继承时候有多个对象,不知道this指哪个
同步监视器可以写this(当前对象), 也可以写static Object obj = new Object();中的obj

2,同步方法


类本身充当锁: 类名.class

同步方法的锁是tihs(默认了),当继承线程时,会创建多个对象, 用同步方法也会出错

同步和死锁

案例:“银行取款问题”,银行账户,可以办卡,可以办存折, 假设,现在两人同时通过存折或者是卡取钱,卡里有500,甲拿卡取500,乙拿着存折也要取500

同步:某一个对象占用CPU资源的时候,其他对象不能抢占CPU的资源,必须等当前对象使用完该资源的时候才能使用CPU资源
异步:就是线程的默认状态,所有对象都可以随时抢占CPU的资源。

实现同步的方式:
1、把需要同步的代码用 synchronized(对象) {} 语句块绑定
2、把需要同步的代码放到方法中,并且用 synchronized 关键字声明,然后再在 run 方法中调用

死锁
过多的同步就有可能导致死锁

线程不同的弊端:

由于一个时间只能有一个线程访问共享数据, 效率变低了

懒汉式单例模式处理线程安全问题

线程的死锁

线程通信

luogg_java学习_12_线程的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. ORB-SLAM2 论文&代码学习 —— LocalMapping 线程

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...

  3. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

  4. 学习C#线程

    2016-12-17 无意间看到了关于C#线程的讲解.经过一下午的学习后,慢慢的对线程也有了一定的理解.这里讲解的是最基础的内容,包括线程的创建.睡眠.等待.终止. 实验环境:Visual studi ...

  5. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  6. java SE学习之线程同步(详细介绍)

           java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:               当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个 ...

  7. 从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...

  8. Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)

    Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...

  9. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

随机推荐

  1. Mycat 全局系列号

    标签:utf8 概述 本篇文章介绍mycat怎样在分库分表的情况下保证主键的全局唯一方法,接下来就来分析三种方法各自的优缺点. 配置 文件方式获取 1.修改server配置文件 vim server. ...

  2. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  3. [ASP.NET MVC 小牛之路]09 - Controller 和 Action (1)

    我们知道,在 MVC 中每个请求都会提交到 Controller 进行处理.Controller 是和请求密切相关的,它包含了对请求的逻辑处理,能对 Model 进行操作并选择 View 呈现给用户, ...

  4. Azure PowerShell (12) 通过Azure PowerShell创建SSH登录的Linux VM

    <Windows Azure Platform 系列文章目录> 本章将介绍如何使用Azure PowerShell,创建SSH登录的Linux VM 前提要求: 1.安装Azure Pow ...

  5. TODO:小程序开发环境搭建

    TODO:小程序开发环境搭建 1.第一步当然是要先注册小程序了 2.登录到小程序 a)完善小程序信息,如名称,图标,描述 3.绑定开发者 4.获取AppID,并设置服务器信息 5.下载并安装开发者工具 ...

  6. Java中常见的29个运行异常

    ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotR ...

  7. g++编译流程

    测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ...

  8. Eclipse开发工具组合键介绍

    1.  编辑类 Ctrl + Q              跳到最后一次的编辑处     Ctrl + 1               快速修复提示     Alt + ↓               ...

  9. AOE网的关键路径的计算

    求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可: Ø  先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间 Ø  再根据终结点的Vl(j)等于它的V ...

  10. 【开源】OSharp3.3框架解说系列:重新开源及3.3版本新特性

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...