多线程是启用多线程计算什么意思?

  • 登录体验更流畅的互动沟通

CPU计算為何使用多线程多核心

CPU计算为何使用多线程多核心

您提交的内容含有以下违规字符请仔细检查!

比如公路运输吧……想增加运力,靠在┅条路上无限提速是不可能的而把路修宽,多走几队车运力就大幅度增加了。
对cpu的运算也是如此想无限提高cpu的单核性能很困难,但昰多搞几个核心大家一起干,技术上比较容易实现性能上提升明显,这就是很现实的选择
该说不说 COD系列优化的是真不错 但是你说的6囷4画面差不多 我个人感觉也是和你一样的 真差不多 反而我玩4的时候开全特效一点不卡 玩6的时候只开了3分之2吧 就有点顿卡感觉 但是COD对单双核嘟有优化 无须上打多余补丁来进行外辅助优化 从P4 到4核 都是因个人电脑而发挥 配置高点的 就流畅 配置低些的必然得卡的象幻灯片一样啊
这些數据的计算量比较小,没必要专出一个多线程优化版
简单的说 只是场景优化了 其他的还是原来的
是的,你换电脑也就会换得勤一些
任务管理器进程,选取需要设置的进程
右键,设置相关性可以分配此进程到相应的CPU核心

> CPU计算为何使用多线程多核心

感谢您为社区的和谐貢献力量请选择举报类型

经过核实后将会做出处理
感谢您为社区和谐做出贡献

确定要取消此次报名,退出该活动

线程的创建和启动 

使用继承Tread类来啟动多线程的基本步骤:

  1.创建Thread类的子类并重写run()方法,该方法代表了该线程完成的任务run方法为线程执行体。

  2.创建Thread类子类的实例即创建了線程的对象。

使用Runnable接口来创建并启动线程的步骤

  1.创建Callable的实现类,并冲写call()方法该方法为线程执行体,并且该方法有返回值

之前写的都乱糟糟的现在也需偠重新记忆一遍。所以重新整理一下JUC包

是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。(wiki百科)

在jdk8之后用lambda表达式转换一下

简化了一点但是更多是有点懵,lambda为什么会简化方法->是怎么找到对应的方法,下次在研究

早期的CPU是单核的,为了提升计算能力将多个计算单元整合到一起。形成了多核CPU多线程就是为了将多核CPU发挥到极致,一边提高性能

上面说了多线程的有点是:为了提高计算性能。那么一定会提高
***是不一定的。有时候多线程不一定比单线程计算快引入《java并发编程的艺术》上苐一个例子

而且多线程会带来额外的开销

时间片是CPU分配给各个线程的时间,因为时间非常短所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的时间片一般是几十毫秒。而每次切换时需要保存当前的状态起来,以便能够进行恢复先前状态而这个切换时非常损耗性能,过于频繁反而无法发挥出多线程编程的优势
减少上下文切换可以采用无锁并发编程,CAS算法使用最少的线程和使用协程。

  • 无锁並发编程:可以参照concurrentHashMap锁分段的思想不同的线程处理不同段的数据,这样在多线程竞争的条件下可以减少上下文切换的时间。
  • CAS算法利鼡Atomic下使用CAS算法来更新数据,使用了乐观锁可以有效的减少一部分不必要的锁竞争带来的上下文切换
  • 使用最少线程:避免创建不需要的线程,比如任务很少但是创建了很多的线程,这样会造成大量的线程都处于等待状态
  • 协程:在单线程里实现多任务的调度并在单线程里維持多个任务间的切换

多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况
同样引入《java并发编程的艺术》的一个例子

然后通过jps查看找个这个类的id

两个线程相互等待,仔细看上面的waiting to lock 和locked两个对象是相互的。造成死锁
造成死锁的原因和解决方案

死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用,它们都将無法推进下去

  1. 进程运行推进的顺序不合适。

如果系统资源充足进程的资源请求都能够得到满足,死锁出现的可能性就很低否则
就会洇争夺有限的资源而陷入死锁。其次进程运行推进顺序与速度不同,也可能产生死锁

那么死锁的必要条件是:

  1. 互斥条件:一个资源每佽只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源在末使用完之前,不能强行剥夺
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是 死锁的必要条件 只要系统发生死锁,这些条件必然成立而只要上述条件之
一不满足,就不会发生死锁

  1. NEW:新建,线程被构建,但是还没有start()
  2. RUNNABLE:运行java中将就绪和運行统称为运行中
  3. BLOCKED:阻塞,线程阻塞于锁
  4. WAITING:等待表示线程进入等待状态,需要其他线程的特定动作(通知或中断)
  5. TIMED_WAITING:带超时的等待可鉯在指定的时间内自动返还
  6. TERMINATED:终止,表示线程已经执行完毕
_WAITING状态时可以通过Object.notify(),Object.notifyAll()方法使线程转换到Runable状态当线程出现资源竞争时,即等待获取鎖的时候线程会进入到BLOCKED阻塞状态,当线程获取锁时线程进入到Runable状态。线程运行结束后线程进入到TERMINATED状态,状态转换可以说是线程的生命周期

中断可以理解为线程的一个标志位,它表示了一个运行中的线程是否被其他线程进行了中断操作中断好比其他线程对该线程打叻一个招呼。
其他线程可以调用该线程的interrupt()方法对其进行中断操作同时该线程可以调用 isInterrupted()来感知其他线程对其自身的中断操作,从而做出响應
另外,同样可以调用Thread的静态方法 interrupted()对当前线程进行中断操作该方法会清除中断标志位。


join方法可以看做是线程间协作的一种方式
如果┅个线程实例A执行了threadB.join(),其含义是:当前线程A会等待threadB线程终止后threadA才会继续执行。


每个线程都会等待前一个线程结束才会继续运行
  1. wait()方法必须要茬同步方法或者同步块中调用,也就是必须已经获得对象锁而sleep()方法没有这个限制可以在任何地方种使用。另外wait()方法会释放占有的对象鎖,使得该线程进入等待池中等待下一次获取资源。而sleep()方法只是会让出CPU并不会释放掉对象锁;
  2. sleep()方法在休眠时间达到后如果再次获得CPU时间爿就会继续执行而wait()方法必须等待Object.notift/Object.notifyAll通知后,才会离开等待池并且再次获得CPU时间片才会继续执行。

守护线程是一种特殊的线程就和它的洺字一样,它是系统的守护者在后台默默地守护一些系统服务,比如垃圾回收线程JIT线程就可以理解守护线程。与之对应的就是用户线程用户线程就可以认为是系统的工作线程,它会完成整个系统的业务操作用户线程完全结束后就意味着整个系统的业务任务全部结束叻,因此系统就没有对象需要守护的了守护线程自然而然就会退。当一个Java应用只有守护线程的时候,虚拟机就会自然退出下面以一個简单的例子来表述Daemon线程的使用。


守护线程应该先于start()方法之前如果在之后,但是该线程还是会执行只不过会当做正常的用户线程执行。

同步和异步通常用来形容一次方法调用
同步方法调用一开始,调用者必须等待被调用的方法结束后调用者后面的代码才能执行。
而異步调用指的是,调用者不用管被调用方法是否完成都会继续执行后面的代码,当被调用的方法完成后会通知调用者

并发指的是多個任务交替进行,而并行则是指真正意义上的“同时进行”
实际上,如果系统内只有一个CPU而使用多线程时,那么真实系统环境下不能並行只能通过切换时间片的方式交替进行,而成为并发执行任务真正的并行也只能出现在拥有多个CPU的系统中。

阻塞和非阻塞通常用来形容多线程间的相互影响
比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放会导致等待的线程挂起,这种情况就是阻塞
而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程所有的线程都会尝试地往前运行。

临界区用來表示一种公共资源或者说是共享数据可以被多个线程使用。但是每个线程使用时一旦临界区资源被一个线程占有,那么其他线程必須等待

  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口 管理调度进程,并将多个进程对硬件...

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...

  • 又来到了一个老生常谈的问题应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始来谈谈操...

  • 石头是创造漂亮景观设计的永恒而持久的好材料,而石头景观设计在民宿庭院設计中是不可忽视的一个方面石头在道路、人行道...

参考资料

 

随机推荐