精华内容
下载资源
问答
  • java多线程问题 多核cpu遇上java多线程,求解释,代码如下:   主机win7 i5双核4线程cpu,虚拟机xp单核,下面代码主机和虚拟机跑得结果差太远了, 主机运行结果和预期不一样,虚拟机却和预计一样 class ...
     
     
    

    java多线程问题 多核cpu遇上java多线程,求解释,代码如下:

     

    主机win7 i5双核4线程cpu,虚拟机xp单核,下面代码主机和虚拟机跑得结果差太远了,
    主机运行结果和预期不一样,虚拟机却和预计一样

    class ThreadDemo1
    {
     public static void main(String [] args)
     {
        TestThread tt = new TestThread();
      new Thread(tt).start();
      try
      {
       Thread.sleep(1);
      }
      catch(Exception e)
      {
       e.printStackTrace();
      }
      tt.str = new String("method");
      new Thread(tt).start();
     }
    }

    class TestThread implements Runnable//*/extends Thread//两种线程方式 继承和实现接口
    {//runnable适合多个线程处理同一个资源
     int tickets = 100;
     String str = new String("");
     public void run()

     { 
      if(str.equals("method"))
      {
       while(true)
       {
        sale();
       }
      }
      else
      { 
       while(true)
        {
         synchronized(this)//用str时不能同步

         {

          if(tickets > 0)
          {
           try
           {
            Thread.sleep(10);//暂停10毫秒
           }
           catch(Exception e)
           {
            e.printStackTrace();
           }
           System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
          }
         }
        }
      }
     }
     public synchronized void sale()//同步函数
     {
      if(tickets > 0)
        {
         try
         { 
          Thread.sleep(10);//暂停10毫秒
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         System.out.print("sale(): ");
         System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
        }
     }
    }

     

    主机运行结果,sale方法根本就没有被执行!

     

     

    虚拟机运行结果:达到预期的同步代码块和同步函数的同步结果

     

    求解释!就高手解释!

    此代码源于张孝祥的java视频,在我机子上运行结果和他视频上的运行结果不一样,却和虚拟机的貌似一样。。

     

     

     

    网上看到如下某些解释:

    关键问题在于,你无法预测每个cpu的时间片分配。所以,要得到你想要的输出结果就属于随机事件了。  对与多核cpu 上的程序同步问题,最好不要用信号量,互斥量,事件对象,因为它们都属于内核对象,都是对一个cpu而言的。其他的cpu根本不会理睬你设置的这些东西。

     

     

    是不是里面的监视器this的问题呀。。。

     

    经过实验,用上面的代码进行分别用this 和str作为监视器实现死锁时,主机不出现思索,虚拟机却出现死锁,看来真的跟多核和this有关

     

    来个高手解释下

    。。。。。
    。。。。。
    。。。。。
    。。。。。

     

     

     

     

     

     

     

    展开全文
  • 下面代码是第一种代码中的注释清楚说明了对于多线程来说对run方法的使用一般是无先后顺序的,但对于单核的cpu来说由于它们都会放在同一个队列中,这时候会有先后顺序,但是对于多核cpu来说,会出现多个队列,如果...

        java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

    下面代码是第一种代码中的注释清楚说明了对于多线程来说对run方法的使用一般是无先后顺序的,但对于单核的cpu来说由于它们都会放在同一个队列中,这时候会有先后顺序,但是对于多核cpu来说,会出现多个队列,如果线程不在同一个队列当中那就无确定的先后顺序。下面的的输出就可以验证。


    package test;
    
    import test.Test6.Mythread;
    
    public class Test6 {
    
      static class Mythread extends Thread{
    	  //这里定义静态类是为了在启动线程时不用
    	  //Test6 p=new Test6();
    	  //Mythread q=p.new Mythread().start();
    	  //静态的直接new Mythread().start();既可以启动
    	     int t;
    	     int time;
    		public void run(){
    			System.out.println("线程"+Thread.currentThread().getId()+"运行了");//这里可能是先是线程9也有可能先是线程10
    			System.out.print(t);//先输出的可能是对象p的变量也有可能是对象p的变量
    			
    		}
    		
    		/*public void start(){
    			System.out.println("我的线程启动了");
    			super.start();
    		}*/
    		
    		public void set(int t1,int time1){
    			t=t1;
    			time=time1;
    			//System.out.println(t);
    		}
    	}
      
      
      public static void main(String args[]) throws InterruptedException{
    	  //这里申明多个线程时对run方法的使用一般是无先后顺序的,但对于单核的cpu来说由于它们都会放在同一个
    	  //队列中,这时候会有先后顺序,但是对于多核cpu来说,会出现多个队列,如果线程不在同一个队列当中那就无确定的先后顺序
    	 Mythread p=new Mythread();//线程9
    	 Mythread p1=new Mythread();//线程10
    	 p.set(2,100);
    	 p1.set(3,50);
    	 p.start();//启动线程9
    	 p1.start();//启动线程10
      }
    	
    }
    


    展开全文
  • 为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。一、python的多线程不能利用多核CPU?原因:因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能...

    为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。

    一、python的多线程不能利用多核CPU?

    原因:

    因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁。

    如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval

    来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处于等待状态

    1、如果是CPU密集型代码(循环、计算等),由于计算工作量多和大,计算很快就会达到100,然后触发GIL的释放与在竞争,多个线程来回切换损耗资源,

    所以在多线程遇到CPU密集型代码时,单线程会比较快

    2、如果是I\O密集型代码(文件处理、网络爬虫),开启多线程实际上是并发(不是并行),IO操作会进行IO等待,线程A等待时,自动切换到线程B,

    这样就提升了效率

    二、其他原理解释

    转:链接:https://www.zhihu.com/question/23474039/answer/24695447

    地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。

    如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch但是:

    如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫,绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

    反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,

    并且用pickle部分地实现了变量共享。再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,

    教你个方法:multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。

    假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency

    from multiprocessing import Pool

    如果把这个代码改成下面这样,就变成多线程实现concurrency

    from multiprocessing.dummy import Pool

    两种方式都跑一下,哪个速度快用哪个就行了。

    转: 链接:https://www.zhihu.com/question/23474039/answer/269526476

    在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL)。

    Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行。

    同样地,虽然Python解释器可以运行多个线程,只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。

    在多线程环境中,Python虚拟机按照以下方式执行。

    1.设置GIL。

    2.切换到一个线程去执行。

    3.运行。

    4.把线程设置为睡眠状态。

    5.解锁GIL。

    6.再次重复以上步骤。

    对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。如果某线程并未使用很多I/O操作,它会在自己的时间片内一直占用处理器和GIL。

    也就是说,I/O密集型的Python程序比计算密集型的Python程序更能充分利用多线程的好处。我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。

    但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,

    让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。

    我们不妨做个试验:

    #coding=utf-8 from multiprocessing

    import Pool from threading

    import Thread from multiprocessing

    import Process

    def loop():

    while True:

    pass

    if __name__ == '__main__':

    for i in range(3):

    t = Thread(target=loop)

    t.start()

    while True:

    pass

    我们发现CPU利用率并没有占满,大致相当于单核水平。

    而如果我们变成进程呢?

    我们改一下代码:

    #coding=utf-8 from multiprocessing

    import Pool from threading

    import Thread from multiprocessing

    import Process

    def loop():

    while True:

    pass

    if __name__ == '__main__':

    for i in range(3):

    t = Process(target=loop)

    t.start()

    while True:

    pass

    结果直接飙到了100%,说明进程是可以利用多核的!

    为了验证这是Python中的GIL搞得鬼,我试着用Java写相同的代码,开启线程,我们观察一下

    package com.darrenchan.thread;

    public class TestThread {

    public static void main(String[] args) {

    for (int i = 0; i < 3; i++) {

    new Thread(new Runnable() {

    @Override

    public void run() {

    while (true) {

    }

    }

    }).start();

    }

    while(true){

    }

    }

    }

    由此可见,Java中的多线程是可以利用多核的,这是真正的多线程!而Python中的多线程只能利用单核,这是假的多线程!

    三、解决方法

    就如此?我们没有办法在Python中利用多核?当然可以!刚才的多进程算是一种解决方案,还有一种就是调用C语言的链接库。对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。我们可以把一些 计算密集型任务用C语言编写,然后把.so链接库内容加载到Python中,因为执行C代码,GIL锁会释放,这样一来,就可以做到每个核都跑一个线程的目的!

    可能有的小伙伴不太理解什么是计算密集型任务,什么是I/O密集型任务?

    计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

    计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

    第二种任务的类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

    IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

    综上,Python多线程相当于单核多线程,多线程有两个好处:CPU并行,IO并行,单核多线程相当于自断一臂。所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

    展开全文
  • C++多线程-多核CPU下的多线程

    千次阅读 2020-01-09 11:25:12
    多核CPU下的多线程 没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有...
    多核CPU下的多线程

    没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务在n个核上运行。我们可以编写一个简单的open mp测试一下,如果还是一个核,运行的时间就应该是一样的。

    #include <omp.h>  
    #define MAX_VALUE 10000000  
      
    double _test(int value)  
    {  
        int index;  
        double result;  
      
        result = 0.0;  
        for(index = value + 1; index < MAX_VALUE; index +=2 )  
            result += 1.0 / index;  
      
        return result;  
    }  
      
    void test()  
    {  
        int index;  
        int time1;  
        int time2;  
        double value1,value2;  
        double result[2];  
      
        time1 = 0;  
        time2 = 0;  
      
        value1 = 0.0;  
        time1 = GetTickCount();  
        for(index = 1; index < MAX_VALUE; index ++)  
            value1 += 1.0 / index;  
      
        time1 = GetTickCount() - time1;  
      
        value2 = 0.0;  
        memset(result , 0, sizeof(double) * 2);  
        time2 = GetTickCount();  
      
    #pragma omp parallel for  
        for(index = 0; index < 2; index++)  
            result[index] = _test(index);  
      
        value2 = result[0] + result[1];  
        time2 = GetTickCount() - time2;  
      
        printf("time1 = %d,time2 = %d\n",time1,time2);  
        return;  
    }  
    
    多线程编程

    为什么要多线程编程呢?这其中的原因很多,我们可以举例解决
    1)有的是为了提高运行的速度,比如多核cpu下的多线程
    2)有的是为了提高资源的利用率,比如在网络环境下下载资源时,时延常常很高,我们可以通过不同的thread从不同的地方获取资源,这样可以提高效率
    3)有的为了提供更好的服务,比如说是服务器
    4)其他需要多线程编程的地方等等

    展开全文
  • 方案1:单线程 假设有个请求,这个请求服务端的处理需要执行3个很缓慢的IO操作(比如数据库查询或文件查询),那么正常的顺序可能是(括号里面代表执行时间): a、读取文件1 (10ms) b、处理1的数据(1ms) c、...
  • Java多核cpu多线程运行效率分析

    千次阅读 2016-03-16 12:14:59
    一直以为java线程开得越多效率越高,后来知道了执行的效率和cpu核心数有关,今天试了下多核cpu多线程的计算: 本机i5四核,分别开启1、4、10、20、40、100、400个线程做100W次,md5运算,结果如下: 全部任务执行...
  • 参考自一位大牛: ... 前言 今天看了下《编程之美》的第...在网上找了很大牛写的方法,但是没找到详细介绍JAVA怎么在多核OS中实现这样效果的。 思考 对于单核CPU的OS,网上提供了很解法。如下代码: public ...
  • 进程和线程多核cpucpu中的运行关系 cpu架构和工作原理 计算机有5大基本组成部分,运算器,控制器,存储器,输入和输出。运算器和控制器封装到一起,加上寄存器组和cpu内部总线构成中央处理器(CPU)。cpu...
  • 多核cpu多线程理解

    万次阅读 2019-01-04 17:00:38
    计算机cpu多线程 进程和线程: 进程包含线程,一个进程中包含多个线程. 线程是cpu调度和分配的基本单位,进程是操作系统进行资源分配(cpu,内存,硬盘io等)的最小单位. 单核cpu: 实现多进程依靠于操作系统的进程...
  • 大家请看代码和输出结果,我百思不得其解,为什么 amount只加了一次,开始我以为是static所致,就算去掉也还是有几率出现这样的结果,难道是多核cpu真的把两个线程同时执行了?![图片说明]...
  • Let's say we have a CPU with 20 cores and a process with 20 CPU-intensive independent of each other threads: One thread per CPU core.I'm trying to figure out whether context switching happens in this ...
  • 前言: 现代的cpu都有流水线,分支预测功能,CPU...同时多线程处理器上的动态分支预测器设计方案研究.pdf 正确地利用这些特性,可以写出高效的程序。 比如在写if,else语句时,应当把大概率事件放到if语句中
  • 单核cpu多核cpu如何执行多线程

    千次阅读 2020-03-31 11:19:00
    花了很多时间来整理这方面的相关内容 程序和进程 程序: 为完成特定任务,用某种语言编写的一组指令集合,即一段静态的代码 进程: 是程序的一次执行过程,或是...一个进程同一时间并行多个线程,多线程是程序有多...
  • python的多线程不能利用多核CPU

    千次阅读 2019-02-13 11:26:12
    为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。 一、python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到...
  • 多线程与单核cpu,多核cpu

    千次阅读 2017-11-08 16:28:30
    //小红书:字符串由字母和数字组成,找出其中最大数字(长度0) ...import java.util.Scanner; public class String_text1{ public static void main(String[] args) { Scanner sc = new Scanner(System.in);
  • 为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。 一、python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁...
  • 先总结:一定要明白多线程是为了让业务流程并发执行,因为IO阻塞问题,所以执行效率自然提高。...1.多线程在单核和多核CPU上的执行效率问题的讨论 a1:多线程在单cpu中其实也是顺序执行的,不过系统...
  • Volatile、多核cpu 处理多线程

    千次阅读 2010-04-28 13:04:00
    这篇文档居然在我的优盘...cpu就意味着个寄存器,实践证明,拥有一个多核cpu对于一个coder来说还是很重要的。 Declaring a volatile Java variable means: · The value of this variable will never be cached t
  • 单核多线程多核多线程 或许有些同学对于单核多线程多核多线程有点误区,因为会听到一些同学问为什么单核能处理多线程,总结了一些干货,下面会通俗说明下。 线程和进程是什么 线程是CPU调度和分配的基本单位...
  • 多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢) 多个cpu的话就可以在两个cpu中同时执行了…………..a2: 单核...
  • 万字图解Java多线程

    万次阅读 多人点赞 2020-09-06 14:45:07
    java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,...
  • 浅谈多核CPU多线程、多进程

    千次阅读 2020-05-12 22:08:51
    1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者...(1)多线程的作用不只是用作并行计算,他还有很多很有益的作.
  • 提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax ////////////////目前情况 需要一个处理50w行的文件,按行...
  • https://www.cnblogs.com/caihuafeng/p/5438753.html
  • 浅谈多核CPU多线程与并行计算 xiaofei08592017-05-09 17:07:113646收藏 展开 0.前言 笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多线程编程兴趣一直不减,一直有所关注,决定写篇文章,...
  • java控制多核cpu的占用率

    千次阅读 2015-06-27 23:28:26
    cpu占用率最高,只要让他时钟周期一直占用就可以了,但是我发现我的cpu是四线程的,i++的while循环只能让cpu工作在25%左右,这主要是因为只有一个线程在满负荷运行,100%分担到四个核心就只有25%了,在我开启两个...
  • 最近在学习CAS,CAS大家都知道,让一个线程不释放CPU而是通过忙循环来等待共享资源的释放,但是如果占用共享资源的线程同时在使用CPU呢?那么等待资源的线程还能执行CPU的忙循环吗? 所以就有了标题上的问题,望解答...
  • 浅谈多核CPU多线程、多进程 1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,846
精华内容 17,938
关键字:

java多线程多核cpu

java 订阅