yhkn.net
当前位置:首页 >> 在jAvA中,多线程真的是多个线程同时运行吗?? >>

在jAvA中,多线程真的是多个线程同时运行吗??

多CPU当然是真多线程.就是CPU可能同时在执行4个线程.但是不是多核也没关系.因为线程的执行往往会挂起,等待IO之类.这时候CPU会转到别的线程来执行.这是分时系统的一大特征.当然人是感觉不到的.用多线程,比如你的处理分为两大部分,一部分产生数据,一部分显示数据,产生数据比较耗时.(生产者消费者模型).这个时候用多线程,一个来产生数据,一个来显示数据.对于界面来说就不会在处理产生数据的时候产生假死的现象.希望能帮到你.

从规范来说,线程就是java线程,你不需要直到是不是和操作系统的线程一样,你也不应该知道,因为有些系统上是模拟的,有些是直接使用操作系统的.从实现来说,目前在多数系统上是一样的.宏观来看是同一时间多个线程在运行,围观到cpu时间,那就是一个cpu时间内,只有一个线程在运行.

如果是单核CPU,在某个时间点只能执行一个线程,但是多核CPU你可以理解为多个单核CPU,当然可以同时执行多个线程啦.

看要你线程的总数,比如,你2个cpu,总共系统中也只有2个线程,那就是真正上的同时执行,如果你的线程数大于cpu数,那事实上还是异步执行的

要分清方法和变量之间的关系方法是变量的处理流程,变量才是一个实例的主体部分,方法是所有实例#共用#的一个流程而已无论哪个线程还是哪个实例都是共用同一个方法,所以都是可以同时执行这个方法的.只是加上锁之后,被同一个锁锁住的实例调用的时候会把其他线程的调用暂停而已.没加锁的则是同时运行方法,若是同一个实例里的话 就会同时对该变量进行修改造成线程错误所以一定是同一个方法 只是有加锁没加锁是其他线程是否需要暂停等待的差别

首先,这个同时,只是在宏观上的,多线程环境,线程与线程之间,还是串行运行的.要“同时”运行多个方法,那么,就需要创建多个线程,然后,在线程的run()方法里,写上你想要实现的逻辑.需如果创建多线程,这又是另一个问题(通过继承Thread跟实现Runnable来实现).

你的思路是对的,CPU就是为了迎合操作系统的多线程从而提高系统的计算效率.但是具体分配任务到各个内核中去执行的并非JAVA与JVM而是操作系统.也就是说,你所执行的多线程,可能会被分配到同一个CPU内核中运行.也可能非配到不同的cpu中运行.如果可以控制CPU的分配,那也应该是操作系统的api才能实现的了

在Thread.sleep(100); 后面加上一个 System.out.println("线程 " + Thread.currentThread().getName()) + " 正在干活"); 然后来跑一下.4个线程会同时运行,但按某个算法来分配 CPU 时间片,这个和多任务操作系统(比如Windows)是类似的原理.多核CPU是每时刻能至少2个线程同时运行,不过我们要意识到我们使用 System.out 时是在共用同一个 OutputStream / PrintStream,因此无法直接观察到细节,所以的 I/O 操作都需要锁定设备后操作,不能并发进行.

如果你添加了锁(synchronized)1. 当前对象是否能获得锁,能获得则执行下一步,否者会进入线程的等待队列(wait()),阻塞并等待其唤醒2. 执行下面的代码3. 释放锁(notifyAll()) 并随机唤醒一个等待线程还有一种可重入锁ReentrantLock与synchronized执行逻辑一致,不同就是一个线程在持有锁的前提下,还可以获得该锁(不要忘记unlock哦)如果想提高性能的话可以了解一下读写锁ReentrantReadWriteLock

多线程的执行要看是否是多核cpu,如果是单核cpu线程是轮流执行,4核cpu能同时执行4个线程,与编程使用的语言无关,

网站首页 | 网站地图
All rights reserved Powered by www.yhkn.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com