Java多线程小总结
多线程
线程与进程
线程:具有完成特定任务的一条执行路径,是CPU执行的最小单位
进程:正在执行的程序
重点:CPU在某个时间刻度上只能够执行一条原子性语句 字节最小是bit位
原子性语句:不能够再次分割的语句。
CPU执行原理
除了多核处理器,本质上CPU在某一个时间点上执行了一条线程
CPU看起来像是同时运行,实际上一次只能执行一个线程的一条原子性语句,之所以看起来同时运行,就是因为处理速度非常快。
在java的线程程序中,采用的是抢占式调度模型
并发与并行的区别
并发:同一个时间段同时执行
并行:在同一时刻上同时执行,物理上的同时执行。
5.同步与异步的区别
同步:本质就是串行执行,并发情况下会出现同步问题。
异步:能够在处理一个任务的同时还能够处理其他事情。
6.一个进程包含多个线程,一个java进程至少包括了主线程、垃圾回收线程
Thread类
自定义类继承Thread类,重写Thread类里面的run()方法。创建线程对象,启动线程。
启动线程的是start()方法,不是run()方法。一下简单说说开启线程的方式。
实现Runnable接口方式开启线程
避免Java单继承带来的局限性
适合多个相同程序的代码区处理同一个资源的情况,比如:多个线程实现分割复制视频。
自定义类实现Runnable接口重写run()方法,并把自定义类作为构造参数传给Thread,进而调用thread.start()方法启动线程
好处:有效的数据分离,可以使用多个线程处理一个数据。
2.实现Callable方式开启线程
需要依赖FutureTask类
FutureTask类对接接口RunnableFuture,RunnableFuture接口继承了Runnable、Future接口。所以Callable本质上还是使用了Runnable接口的实例来开启线程。不同的是Callable类可以产生值返回,但是使用get()获取值会堵塞线程。
3.匿名内部类开启线程
没啥好说的就是匿名创建了Thread对象,并开启线程。也可以匿名创建Runnable子类并给Thread调用开启线程,不过两种方式一起使用,优先使用Thread的子类。
设置获取线程的名称
1.通过构造方法
Thread(String name) 创建一个名叫name的线程
Thread(Runnable target,String name)
2.通过线程的成员方法
setName(String name)
getName()
3.通过静态方法
threa.currentThread().getName();获取主线程的名称
getId();获取线程的ID,long类型
线程的优先级
java使用的是抢占式调度模型,优先级高的线程会优先使用CPU,同级别的优先级,则是随机选择,优先级高的获取CPU的时间相对要多一些。
设置获取优先级:
public final int getPriority() 获取线程的优先级
public final void setPriority(int newPriority) 设置线程的优先级
线程的优先级:1~10,10个级别,数值越高优先级越高。系统的优先级,基本上我们无法控制,我们所设置的优先级,只是局部的程序。
线程休眠
Thread.sleep(1000); 阻塞正在执行的线程1秒
线程中断
public final void stop():停止线程,直接终止线程,不会再执行。
public void interrupt(); 给子线程抛出一个异常,子线程还可以继续执行。
后台线程
一般来说JVM中会包括两种线程:用户线程、后台线程
后台线程:在程序运行的时候在后台提供的一种通用的服务线程,并且这种线程,并不是程序的必要部分。
当用户线程结束时,会终结所有的后台线程。
比如:程序中主线程结束了,其他子线程也会被强制结束。
线程加入
public final void join(); t1.join:优先让t1线程执行结束。
线程礼让
public static void yield() 使线程让出CPU的执行权,然后和其他线程一起再来抢这个执行权。
Java多线程小总结的更多相关文章
- java多线程小题一瞥
有如下线程类定义: public class MyThread extends Thread { private static int num = 0; public MyThread() { num ...
- Java——多线程小例子
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Java多线程小例子(三个窗口卖火车票)
class Ticket implements Runnable{ private int TicketNum = 100; //100张火车票 private boolean flag = true ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- Java多线程开发系列之四:玩转多线程(线程的控制2)
在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
随机推荐
- Entity Framework Core 关联删除
关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征:即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值. 数据库关联删除行为 我们 ...
- 离线安装mysql数据库
开源数据库mysql,目前使用很广泛.作为程序员开发项目时,与关系型数据库打交道最多的估计也是mysql了.那么本文首先讲解如何离线安装mysql数据库,毕竟有很多项目部署在内网. 1.离线安装 本人 ...
- CSharpGL(46)用Billboard绘制头顶文字
CSharpGL(46)用Billboard绘制头顶文字 本文介绍CSharpGL用Billboard绘制头顶文字的方法.效果如下图所示. 下载 CSharpGL已在GitHub开源,欢迎对OpenG ...
- CODING 研发管理系统上线全球加速,助力企业跨区域协作
CODING 研发管理系统现已全面支持全类型代码仓库的 全球加速访问. 随着国内互联网红利的日趋枯竭与全球互联网的加速普及.越来越多的企业开始走出国门,将目光投向全世界,搭建跨国体系.跨出国门的中国企 ...
- 可能是最全面的G1学习笔记
引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑,希望能够在这篇文章中得到解决. G1出现的初衷 ...
- IIS网站部署后,程序常见错误记录
1.网站部署步骤 开启IIS服务.打开IIS管理器.添加网站.修改程序池(4.0).部署完成. 2.常见问题记录(问题记录比较模糊,仅做参考) (1).对于web.config连接数据库的配置为win ...
- 关于a[i]++和a[i++]说明
1.a[i]++:表示对当前数组元素值自增,此时可以把a[i]简单看做一个变量x,操作后,x的值加1: int main() { ]; ; a[i] = ; a[i]++; printf(" ...
- falkonry
falkonry.com/ 2019 Top 100 AI companies in the world
- 【重磅】微软开源自动机器学习工具 - NNI
[重磅]微软开源自动机器学习工具 - NNI 在机器学习建模时,除了准备数据,最耗时耗力的就是尝试各种超参组合,找到模型最佳效果的过程了.即使是对于有经验的算法工程师和数据科学家,有时候也很难把握其中 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...