1. 什么是进程

  • 一个软件,在操作系统中运行时,我们称其为进程。
  • 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。

2. 什么是线程

  • 在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分成多个运行区域,每个独立的小区域(小单元)称为一个线程。线程是进程的一个实体,是 CPU 调度和分派的基本单位,是比进程更小的能独立运行的基本单位。
  • 一个程序至少有一个进程,一个进程至少有一个线程。

3. 什么是多线程

  • 首先我们来了解一下串行、并行和并发三个概念,这有助于我们了解多线程。串行:一条线程按照顺序依次执行所有任务。并行:同一时间多个线程同时执行,没有执行的先后顺序。并发:同一时间有多个可以执行的线程,一条执行,其它等待。
  • 一个进程如果只执行一条执行任务或一个线程依次执行多个执行任务,则称为单线程程序。一个进程拥有多个执行任务,并且同时开启多个线程去完成这些任务(并发),则称为多线程程序。
  • 多个线程同步执行多个任务,这样做的优点是防止线程堵塞,增强用户体验和程序的效率,但同时也会面临一个问题:多个线程同时访问相同的资源并进行读写操作可能会出现线程安全问题。

4. 如何实现多线程

  • 在Java中实现多线程一共有四种方法,这四种方法其实也可以分为两类
  • java 5 之前就有的方法1.继承Thread类,重写run方法,没有返回值(其实Thread类本身也实现了Runnable接口)2.实现Runnable接口,重写run方法,没有返回值
  • java 5 之后出现的方法3.实现Callable接口,重写call方法,有返回值4.使用线程池
  • 1.继承Thread
public class MyThread extends Thread {@Overridepublic void run() {System.out.println("my thread .....");}
}

  • 2.实现Runable接口
public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("my runnable ....");}
}

  • 3.实现 Callable 接口
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;class MyTask implements Callable<Integer> {private int upperBounds;public MyTask(int upperBounds) {this.upperBounds = upperBounds;}@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 1; i <= upperBounds; i++) {sum += i;}return sum;}
}
class Test01 {public static void main(String[] args) throws Exception {List<Future<Integer>> list = new ArrayList<>();ExecutorService service = Executors.newFixedThreadPool(10);for(int i = 0; i < 10; i++) {list.add(service.submit(new MyTask((int) (Math.random() *100))));}int sum = 0;for(Future<Integer> future : list) {// while(!future.isDone()) ;sum += future.get();}System.out.println(sum);}
}

  • 4.实现线程池,Java API 提供了 Executor 框架让你可以创建不同的线程池,有单线程的,也有多线程的相关的。共有4种线程池:
  • 1)newCachedThreadPool 创建一个可缓存线程池
public void cacheThreadPoolTest() {ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 1; i <= 5; i++) {final int j = i;try {Thread.sleep(j * 1);} catch (InterruptedException e) {e.printStackTrace();}cachedThreadPool.execute(()->out.println("线程:" + Thread.currentThread().getName() + ",执行:" + j));}}

  • 2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数。
public void fixTheadPoolTest() {ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);for (int i = 0; i < 5; i++) {final int j = i;fixedThreadPool.execute(() -> {out.println("线程:" + Thread.currentThread().getName() + ",执行:" + j);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}});}
}

  • 3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
public void sceduleThreadPoolTest() {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);Runnable r1 = () -> out.println("线程:" + Thread.currentThread().getName() + ",执行:3秒后执行此任务");scheduledThreadPool.schedule(r1, 3, TimeUnit.SECONDS);Runnable r2 = () -> out.println("线程:" + Thread.currentThread().getName() + ",执行:延迟2秒执行一次后每1秒执行一次");scheduledThreadPool.scheduleAtFixedRate(r2, 2, 1, TimeUnit.SECONDS);Runnable r3 = () -> out.println("线程:" + Thread.currentThread().getName() + ",执行:普通任务");for (int i = 0; i < 3; i++) {scheduledThreadPool.execute(r3);}
}

  • 4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务。
public void singleTheadExecutorTest() {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 5; i++) {final int j = i;singleThreadExecutor.execute(() -> out.println("线程:"+Thread.currentThread().getName() + ",执行:" + j));}
}

5. 什么是线程安全问题

  • 多线程环境中,且存在数据共享,一个线程访问的共享数据被其它线程修改了,那么就发生了线程安全问题;整个访问过程中,无一共享的数据被其他线程修改,就是线程安全的。
  • 程序中如果使用成员变量,且对成员变量进行数据修改,就存现数据共享问题,也就是线程安全问题。

6. Java如何解决线程安全问题

  • 使用线程同步机制Lock 锁机制
Lock lock  = new ReentrantLock();
lock.lock();
try{
//可能会出现线程安全的操作
}finally{
//释放锁
lock.unlock();

  • synchronized 关键字
public synchronized void test01(){//该方法同一时间只能被一个线程访问
}public void test02(String str){System.out.println("111");synchronized (str) {//该区域同一时间只能被一个线程访问}System.out.println("2222");
}

  • 消除共享数据:即多个线程数据不共享或者共享的数据不做修改。使用局部变量,不使用成员变量。如果使用成员变量,对成员变量不进行修改。

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...相关推荐

  1. 多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 什么是进程? 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的.比如下图中的QQ.酷狗播放器.电脑 ...

  2. 电脑卡顿不流畅怎么解决_电脑用久了卡怎么办?学会这四招解决你的电脑卡顿问题...

    很多人在遇到电脑卡顿时总会吐槽:这电脑配置真烂,或者Windows系统垃圾,又或是转向攻击其他事物(品牌.硬件等).其实这些吐槽有的对,有的不对.有些时候确实是电脑的锅,有的时候却是操作系统或软件的问 ...

  3. linux线程能删除自身吗,Linux内核本身和进程的区别 内核线程、用户进程、用户...

    这个概念是很多人都混淆的了,我也是,刚开始无法理解OS时,把Linux内核也当做一个进程. 其实内核本身不是以进程形式存在的,最多在初始化的过程中表现得就像一个进程,但是内核绝对没有进程的数据结构ta ...

  4. app屡次停止运行怎么解决_打桩机发动机温度过热的问题及运行中熄火怎么解决_行业新闻...

    打桩机发动机温度过热的问题及运行中熄火怎么解决 作者:中联德美日期:2020/10/27 11:38:51 波形护栏打桩机运作中息火怎么解决? 波形护栏打桩机对公路建设拥有关键功效,用于打击道路防护栏 ...

  5. vb里面计算误差咱们解决_盘点3dmax渲染出来是黑色的6个原因及解决方法

    大家好,我是逆水,今天来分享渲染异常的解决办法. 所谓的渲染异常就是渲染出来画面是黑的或者是白的.或者物体错乱等现象,这些都属于渲染异常. 碰到这些问题需要我们一项项去检查排除. 排查一:相机位置 先 ...

  6. 不同模块下包重名怎么解决_注册公司核名通不过,疑难核名有办法解决吗?

    公司名字对于很多创业者或老板来说实际上是非常重要的,公司名字不仅仅能给业务范畴做出一个想想的空间,更是企业道路发展一直伴随的一面旗帜.因此取一个好的公司名字并简单,个别注重这方面的人更是会找人算好名字 ...

  7. w7电脑蓝屏怎么解决_电脑突然蓝屏,教您电脑突然蓝屏怎么解决

    可能还有些网友对于电脑总是会突然蓝屏的情况不太了解,出现蓝屏的原因有很多,但大部分都不是电脑硬件的损坏,只是小问题,有不小心安装了恶意软件,被恶意修改程序,硬件不相容,电脑同时打开太多网页和软件使用, ...

  8. 笔记本显示网络电缆被拔出怎么解决_电脑显示网络电缆被拔出原因有哪些【解决方法】...

    现在,电脑几乎充满了人们的生活,不仅工作.生活甚至休闲也是时刻都能见到它的身影.电脑使用的频繁了,总会遇到一些问题.很多朋友就经常会遇到电脑提示网络电缆被拔出,进而导致电脑网络连不上或是网络老是中断. ...

  9. 工程未编译怎么解决_沈阳建筑工程律师:拖欠工程款—工程款被恶意拖欠怎么解决...

    在当前的项目建设中,经常会遇到许多开发商故意拖欠承包商的工资或相关款项的情况.那么如何解决项目付款的恶意违约呢?接下来,小编为大家解答相关问题. 辽宁卓政律师事务所 首先是迅速进行谈判和提出要求.有很 ...

最新文章

  1. 几个SQL命令的使用
  2. shell 输出数据到文本_Linux运维工程师从基础到进阶:Shell变量知识梳理
  3. Linux 总线、设备、驱动模型的探究
  4. c++文件流基本用法(fstream, ifstream, ostream)
  5. 如何抓取一个网站的分页_如何设计一个吸引人的网站
  6. JS一些概念知识及参考链接
  7. Meinheld 和 Gevent_XYM
  8. html color 转换,Color颜色转换的三种方式(c#)
  9. modelsim教程
  10. 计算机专业买哪一款华硕电脑好,华硕笔记本哪款好 如何挑选笔记本电脑
  11. 随机生成游戏建筑物的算法
  12. 【Meta Learning学习笔记】Meta Learning详解
  13. allure企业级定制报告
  14. 打开Word提示向程序发送命令时出现问题怎么办?
  15. 来到 “鹅厂” 的 2019
  16. 好心情:当你被告知你患有抑郁症了,该怎么办
  17. 《宝塔面板教程5》:如何上传网站程序安装自己的网站
  18. 分享编程技术的微信公众号二维码
  19. 怎么开通代付通道接口?
  20. lombok @Data注解打印时不会打印父类属性

热门文章

  1. 递归/回溯:Generate Parentheses生成合法括号
  2. Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
  3. Uva 10048 - Audiophobia (Floyd变形)
  4. Spring+SpringMVC+shiro+mysql(一)
  5. 20160127:开始学VBA:(三)、判断语句
  6. Java基础-常量,变量,成员变量,局部变量
  7. Windows 7+Code::Blocks+wxWidgets实录(一)
  8. AJAX学习基础:简单介绍数据岛使用方法
  9. asp.net2.0导出pdf文件完美解决方案【月儿原创】
  10. 特殊SQL语句及优化原则