`

更好的把握线程<一>:Thread (线程)介绍

阅读更多
线程(引用自Java API doc):
引用
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。


线程的一些特性:
  • 所有的Java代码都是在某个线程中执行的,所以在任一行Java代码中使用Thread.currentThread()都可以得到当前运行线程。
  • JVM允许多个线程并发执行,虽然同一时刻只能有一个线程占用CPU,但每个线程占有的时间片非常短,所以人类的感官上多个线程是并发执行的。
  • 当 JVM启动时,至少有一个用户线程运行,即执行某个类的main方法的线程。


线程在下列情况之一终止运行:
  • Thread.run方法运行完毕(或者是Thread包含的Runnable对象的run方法执行完毕)
  • run方法内的代码运行时发生异常。


JVM在下列情况下终止运行:
  • 所有非守护线程(即用户线程,非daemon线程)终止。假如有main线程和另外一个用户线程在运行,即使main线程终止了,还必须等待另外一个线程终止JVM才会终止。
  • 调用了Runtime类的exit方法(启动虚拟机的关闭序列)。
  • 外部程序强行终止虚拟机执行(非正常退出)。


创建线程:
[list]
  • 继承Thread类,覆盖run方法
  • 实现Runnable接口,通过Thread类的带Runnable参数的构造函数传入到Thread对象内,一种常用的方式:
  • Thread t=new Thread(new Runable(){
      public void run(){
         //do something
      } 
    });
    

    [/list]
    运行线程:
    • 调用Thread的start方法,调用之后,JVM启动一个新的线程,在新线程中执行该线程对象的run方法。
    • 线程启动之后,不能再调用start方法,否则会抛出IllegalThreadStateException

    线程的一些自动继承的特性:
    • 如果未指明优先级,则被创建的线程和创建它的线程具有相同优先级。
    • 如果未指明ThreadGroup,则被创建的线程和创建它的线程使用相同的ThreadGroup。如果指定ThreadGroup为null,则系统会自动将本线程加入系统级的ThreadGroup。所以说不存在没有ThreadGroup的线程。
    • 如果未指明是否守护线程,则被创建的线程和创建它的线程具有相同的daemon属性。也就是说守护线程创建的线程如果未特别指定,则是守护线程,用户线程创建的线程如果未特别指定,则是用户线程。main线程是用户线程,除非被Thread.currentThread().setDaemon(true)方式改变。(根据oxromantic的指正,此处是错误的,正在运行的线程如果调用setDaemon会抛出java.lang.IllegalThreadStateException异常,main线程肯定是正在运行的,setDaemon只有在start()方法之前调用才有效。感谢oxromantic指正)
    守护线程和用户线程:
    [list]
  • 当最后一个用户线程终止的时候,所有守护线程将被“终止”(不是被interrupt),虚拟机退出。即使守护线程是个死循环。以下代码放入main方法里:
  • //请等待足够久的时间(可能是1-2分钟),程序会自动停止。
    Thread t1=new Thread(){
     public void run(){
      int i=0;
      while(true){//死循环
       i++;
       System.out.println(i);
       //Thread.yield();//如果想让t2有机会更快完成,需要调用yield让出CPU时间。
      }
     }
    };
    t1.setDaemon(true);//注释掉这句就可以看出区别了。
    Thread t2=new Thread(){
     public void run(){
      int i=50000;
      while(i>0){
       i--;
      }
      System.out.println("t2 done");
     }
    };
    t1.start();
    t2.start();
    

    [/list]
    线程优先级:
    • 线程优先级范围是1-10,1最低优先级10最高优先级。
    • 优先级越高越先被JVM从“等待运行”(waiting-to-run)的状态挑选出来运行。
    • JVM线程和操作系统线程的关系有2种(甚至可能是3种,依赖于平台和JVM实现):
    •   [list=1]
       
    • n-1关系,所有JVM线程都在同一个OS线程中运行。
    •  
    • n-m关系,一个JVM线程是可以在多个OS线程中运行,一个OS线程可运行多个JVM线程,不管硬件是多核还是单核。
    •  
    • 1-1关系,一个JVM线程对应一条OS进程。(早期JVM的在Linux上的实现版本)
    •  

    所以,线程的优先级设置是不可靠的,依赖于JVM实现和OS。.NET线程5个等级:Highest,AboveNormal,Normal,BelowNormal,Lowest.Solaris有15个等级,最高的5个等级是给进程中断层级(Process Interrupt Levels ,PILs)使用。也就是说PIL可以中断普通进程知道执行直到其运行结束。剩下的10个优先级可以被线程使用。所以优先级8和9可能并没有区别。默认优先级是5,最大优先级由所在ThreadGroup的maxPriority决定。也就是说所属ThreadGroup最大优先级是8则,以构造函数Thread(ThreadGroup g,String name)所创建的线程即使将其设置为10,优先级仍然是8.
  • 当等待运行的线程中有3种优先级相差比较大的线程在运行的时候,单任务操作系统会按高-中-低的顺序来执行线程,也就是说先跑完所有高等级的再跑低等级的,多任务操作系统则会间歇执行,但不保证高优先级的、相同任务内容的任务会更快完成,即使你让线程跑上10分钟。非常诡异,可能跟CPU是双核有关(但用3个优先级且混合启动线程还是有可能高优先级的跑输给低优先级的,哪怕是最高10和最低1)。
  • 给出代码,请读者分别在Linux和Windows下测试,有条件的话在Solaris上也试试。给个报告出来。
    	public static void main(String[] args) throws Exception {
    		int x=211;//210个线程分3组,每组70个,第211是“发令枪”
    		int n=0;//a类线程数量,本类线程优先级最高
    		int m=0;//b类线程数量,本类线程优先级最低
    		int l=0;//c类线程数量,本类线程优先级中间(5)
    		
    		final CyclicBarrier cb=new CyclicBarrier(x);//发令枪类,让所有线程理论上在同一起跑线(也许和逐个逐个start没区别)
    		final List ln=new ArrayList(7);//存放a类线程的列表,为了在匿名类中可见,定义为final,7原本是21个线程在跑,后来为了理论上消除误差,增加到70个,此处没有修改过来。
    		final List lm=new ArrayList(7);//存放b类线程的列表
    		final List ll=new ArrayList(7);//存放c类线程的列表
    		for(int i=0;i<x-1;i++){//为了避免线程在创建的时候同类线程扎堆(理论上可能)产生误差,打乱创建过程。为了避免2组线程分别在双核CPU上各自单核上运行,采用了3组线程。
    			Runner t=null;
    			if(i%3==0){
    				t=new Runner(cb,"a"+i);
    				t.setPriority(8);//可以用10,但测试结果看不出区别。
    				ln.add(t);
    				n++;
    			}else if(i%3==1){
    				t=new Runner(cb,"b"+i);
    				t.setPriority(2);//可以用1,
    				lm.add(t);
    				m++;
    			}else{
    				t=new Runner(cb,"c"+i);
    				t.setPriority(5);
    				ll.add(t);
    				l++;
    			}
    			t.start();//不是真的启动线程哦。请看Runner类
    		}
    		System.out.println(n);//检验是不是每组70个。
    		System.out.println(m);
    		System.out.println(l);
    		
    		try {
    			Thread.sleep(3000);//本意是为了让Runner在起跑线都预备好,在此停3秒。减少误差。
    			Timer timer =new Timer(true);//定时打印结果的线程。
    			timer.scheduleAtFixedRate(new TimerTask(){
    
    				@Override
    				public void run() {//定时打印每组线程的结果的平均值,由于打印是有先后顺序的,所以使用平均值,消除时间差(用心良苦啊。。。)
    					System.out.println("a avg--"+getAvg(ln));//可以将a组的结果放在最后,结果通常还是a最慢
    					System.out.println("b avg--"+getAvg(lm));
    					System.out.println("c avg--"+getAvg(ll));
    				}
    				
    				
    			}, 3000, 3000);//3秒打印一次。
    			cb.await();//发令枪响。
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (BrokenBarrierException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println("started ");
    		
    		
    	}
    	
    	
    	public static BigInteger getAvg(List l){//为什么用大整数?因为long,和int我都试过得不到想要的结果。
    		BigInteger total=BigInteger.valueOf(0);
    		for (Iterator iter = l.iterator(); iter.hasNext();) {
    			Runner r = (Runner) iter.next();
    			total=total.add(r.getCountPerMs());
    		}
    		return total.divide(BigInteger.valueOf(l.size()));//同组线程的结果的平均值
    	}
    	
    	static class Runner extends Thread{//有心人可以试试改成只实现Runnable接口
    		private CyclicBarrier cb;
    		private String name;
    		private BigInteger count=BigInteger.valueOf(0);
    		private long startTime;
    		public Runner(CyclicBarrier cb,String name){
    			this.cb=cb;
    			this.name=name;
    		}
    		public void run(){
    			try {
    				cb.await();//让其在起跑线上等待其他线程和发令枪声
    				System.out.println(this.name+"start");//看看各个线程真正跑起来是否一致,不怕,每组有70条,一条拖后退问题不大,只要运行时间够长,体力好的应该还是不会输在起跑线的。
    				
    				startTime=System.currentTimeMillis();//原本是为了消除时间差使用的,效果不好,改用发令枪,留着成了僵尸代码
    				for (;;) {
    					count=count.add(BigInteger.valueOf(1));
    					Thread.sleep(1);//调试手段,为了使线程慢跑,可以去掉对比结果。
    //					if(count%10000==0){
    //						Thread.yield();//调试手段,效果不明显,也毙掉了。
    //					}
    //					if(count.mod(m)==0){
    //						String info = name+":"+(count/100000)+"--"+this.getPriority()+"-"+this.isDaemon();
    ////						System.out.println(info);//早期调试手段,毙掉。
    //					}
    				}
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			} catch (BrokenBarrierException e) {
    				e.printStackTrace();
    			}
    			 
    		}
    		public BigInteger getCountPerMs(){
    //			long value=System.currentTimeMillis()-startTime;
    ////			System.out.println(value);
    ////			System.out.println("count "+this.count);
    //			if(value==0)return BigInteger.valueOf(0);
    //			return this.count.divide(BigInteger.valueOf(value));
    //以上一大段注释掉的代码原本是为了消除时间差的。没啥效果,毙掉
    			return this.count;
    		}
    	}
    
    

    结果大大出乎意料,通常a跑得最慢,b跑得最快.......
    理论估计:会不会是a优先级高切换太频繁,切换的开销大过运行的开销??,猜测,高手可以指点一下。
    结论:不要依赖线程之间的竞争来得到想要的结果。
    [/list]
    先写到这,下一节开讲线程的使用技巧和设计思想。

    分享到:
    评论
    7 楼 llade 2008-12-30  
    oxromantic 写道
    这种自己不认真验证的文章真是误人子弟
    Thread.currentThread().setDaemon(true)
    你倒是设给我看看

    引用
        /**
         * Marks this thread as either a daemon thread or a user thread. The
         * Java Virtual Machine exits when the only threads running are all
         * daemon threads.
         * <p>
         * This method must be called before the thread is started.
          * <p>
         * This method first calls the <code>checkAccess</code> method
         * of this thread
         * with no arguments. This may result in throwing a
         * <code>SecurityException </code>(in the current thread).
        *
         * @param      on   if <code>true</code>, marks this thread as a
         *                  daemon thread.
         * @exception  IllegalThreadStateException  if this thread is active.
         * @exception  SecurityException  if the current thread cannot modify
         *               this thread.
         * @see        #isDaemon()
         * @see        #checkAccess
         */
        public final void setDaemon(boolean on)

    谢谢你的指正。的确是无法修改已启动的用户线程的为守护线程。感谢你那么仔细的阅读拙作
    6 楼 oxromantic 2008-12-30  
    这种自己不认真验证的文章真是误人子弟
    Thread.currentThread().setDaemon(true)
    你倒是设给我看看

    引用
        /**
         * Marks this thread as either a daemon thread or a user thread. The
         * Java Virtual Machine exits when the only threads running are all
         * daemon threads.
         * <p>
         * This method must be called before the thread is started.
          * <p>
         * This method first calls the <code>checkAccess</code> method
         * of this thread
         * with no arguments. This may result in throwing a
         * <code>SecurityException </code>(in the current thread).
        *
         * @param      on   if <code>true</code>, marks this thread as a
         *                  daemon thread.
         * @exception  IllegalThreadStateException  if this thread is active.
         * @exception  SecurityException  if the current thread cannot modify
         *               this thread.
         * @see        #isDaemon()
         * @see        #checkAccess
         */
        public final void setDaemon(boolean on)
    5 楼 hdware 2008-12-30  
    收藏了,慢慢看,最近被进程搞死了
    4 楼 llade 2008-06-12  
    本人INTEL T2050 CPU,双核。系统是WindowsXP
    3 楼 llade 2008-06-12  
    把A组放在后面统计,我的运行结果如下,A组反而落后于B组
    70
    70
    70
    b16start
    c17start
    a18start
    c20start
    b19start
    a21start
    b22start
    c23start
    a24start
    b25start
    c26start
    a27start
    b28start
    c29start
    a30start
    b31start
    c32start
    a33start
    b34start
    c35start
    a36start
    b37start
    c38start
    a39start
    b40start
    c41start
    a42start
    b43start
    c44start
    a45start
    b46start
    c47start
    a48start
    b49start
    c50start
    a51start
    b52start
    a54start
    b55start
    c56start
    a57start
    b58start
    c59start
    a60start
    b61start
    c62start
    a63start
    b64start
    a66start
    c65start
    b67start
    c68start
    a69start
    b70start
    c71start
    a72start
    b73start
    c74start
    a75start
    b76start
    c77start
    a78start
    b79start
    c80start
    a81start
    b82start
    c83start
    a84start
    b85start
    c86start
    a87start
    b88start
    c89start
    a90start
    b91start
    c92start
    a93start
    b94start
    c95start
    a96start
    b97start
    c98start
    a99start
    b100start
    a15start
    c53start
    c101start
    b103start
    a105start
    c107start
    b109start
    a111start
    c113start
    b115start
    a117start
    c119start
    b121start
    b124start
    a123start
    a126start
    c125start
    c128start
    b127start
    b130start
    a129start
    a132start
    c131start
    b133start
    a135start
    c137start
    b139start
    c140start
    a141start
    b142start
    c143start
    a144start
    b145start
    c146start
    a147start
    b148start
    c149start
    a150start
    b151start
    c152start
    a153start
    b154start
    c155start
    a156start
    b157start
    c158start
    a159start
    b160start
    c161start
    a162start
    c134start
    b163start
    c164start
    a165start
    b166start
    c167start
    a168start
    b169start
    c170start
    a171start
    c173start
    b175start
    c176start
    a177start
    c179start
    b181start
    c182start
    a183start
    c185start
    a186start
    b187start
    c188start
    a189start
    b190start
    c191start
    a192start
    b193start
    a195start
    b196start
    c197start
    a198start
    b199start
    c200start
    a201start
    b202start
    c203start
    a204start
    b205start
    c206start
    a207start
    c209start
    a108start
    b112start
    a114start
    c116start
    b118start
    a120start
    c122start
    b136start
    a138start
    b172start
    b178start
    a180start
    b184start
    b208start
    started 
    b1start
    a0start
    c2start
    a3start
    b4start
    c5start
    a6start
    b7start
    c8start
    a9start
    b10start
    c11start
    a12start
    b13start
    c14start
    c194start
    a174start
    a102start
    c104start
    b106start
    c110start
    b avg--94766
    c avg--94174
    a avg--115073
    b avg--224373
    c avg--216470
    a avg--207931
    b avg--341876
    c avg--344409
    a avg--332709
    b avg--466582
    c avg--466450
    a avg--448567
    b avg--659035
    c avg--653320
    a avg--638056
    b avg--784288
    c avg--776086
    a avg--770561
    b avg--908349
    c avg--898104
    a avg--894808
    b avg--1021412
    c avg--1026939
    a avg--1015154
    b avg--1141776
    c avg--1147952
    a avg--1131192
    b avg--1266781
    c avg--1270811
    a avg--1246034
    2 楼 wkbulletin 2008-06-12  
    70
    70
    70
    started 
    a21start
    c140start
    c20start
    a24start
    c23start
    b133start
    b82start
    c83start
    a84start
    b19start
    b13start
    c86start
    a27start
    a87start
    b136start
    b139start
    a141start
    c143start
    a144start
    b145start
    c146start
    a147start
    b148start
    a150start
    c149start
    b151start
    c152start
    a153start
    b142start
    b154start
    c155start
    a156start
    c158start
    a159start
    b157start
    a162start
    b88start
    a30start
    c29start
    b163start
    c164start
    c26start
    c32start
    a165start
    a33start
    a0start
    c35start
    a6start
    c167start
    a36start
    c2start
    b166start
    a168start
    c161start
    b169start
    c170start
    b28start
    a171start
    b172start
    c173start
    a174start
    b175start
    c176start
    a177start
    b178start
    c179start
    a180start
    b85start
    b181start
    c182start
    a183start
    a90start
    c38start
    c89start
    b160start
    b37start
    b184start
    c185start
    a186start
    b187start
    c188start
    a189start
    a192start
    c191start
    b193start
    c194start
    b190start
    a195start
    b196start
    c197start
    a198start
    b199start
    c200start
    a201start
    b202start
    a39start
    b22start
    a204start
    c203start
    c92start
    a93start
    c5start
    a42start
    c41start
    c95start
    b91start
    b40start
    b94start
    a96start
    b25start
    b31start
    a3start
    c98start
    a45start
    a99start
    b97start
    b205start
    c206start
    a207start
    b208start
    c209start
    c47start
    c101start
    b7start
    b100start
    a48start
    a102start
    c44start
    b103start
    a51start
    a105start
    c50start
    c104start
    b4start
    a9start
    a108start
    b109start
    c110start
    a54start
    c8start
    a111start
    b112start
    c107start
    c113start
    a114start
    b106start
    b115start
    c11start
    c116start
    c53start
    a117start
    b49start
    b118start
    a57start
    a120start
    c119start
    b34start
    b46start
    b52start
    b55start
    b43start
    c122start
    a60start
    a123start
    c59start
    c56start
    b124start
    c125start
    a63start
    c62start
    b61start
    a126start
    b58start
    a12start
    b127start
    b121start
    c128start
    a72start
    a66start
    a129start
    b10start
    b70start
    b64start
    a69start
    c65start
    c71start
    c68start
    c131start
    b1start
    b130start
    a132start
    c74start
    b16start
    a138start
    b73start
    a15start
    a75start
    c137start
    c134start
    a135start
    a78start
    c77start
    c14start
    a18start
    b76start
    b67start
    b79start
    c17start
    c80start
    a81start
    a avg--1508
    b avg--1481
    c avg--1501
    a avg--3003
    b avg--2938
    c avg--2977
    a avg--4520
    b avg--4427
    c avg--4481
    a avg--6033
    b avg--5908
    c avg--5982
    a avg--7552
    b avg--7396
    c avg--7487
    a avg--9069
    b avg--8889
    c avg--8993
    a avg--10586
    b avg--10376
    c avg--10499
    a avg--12104
    b avg--11869
    c avg--12007
    a avg--13625
    b avg--13363
    c avg--13513
    a avg--15139
    b avg--14851
    c avg--15018
    a avg--16658
    b avg--16335
    c avg--16521
    a avg--18177
    b avg--17782
    c avg--18015
    a avg--19697
    b avg--19260
    c avg--19518
    a avg--21216
    b avg--20713
    c avg--21005
    a avg--22737
    b avg--22210
    c avg--22511
    a avg--24255
    b avg--23703
    c avg--24018
    a avg--25771
    b avg--25192
    c avg--25522
    1 楼 tianhaoleng 2008-06-12  
    期待楼主续作!我觉得写的很好。

    相关推荐

      C++多线程编程(教程+Demo)代码

      1. 创建线程:使用`std::thread`类创建新的线程。例如: ```cpp #include &lt;iostream&gt; #include &lt;thread&gt; void hello() { std::cout &lt;&lt; "Hello, World from thread!" &lt;&lt; std::endl; } int main() { std::thread ...

      C++多线程封装成类使用示例

      在C++编程中,多线程是实现并发...将多线程封装到类中,如`ThreadPool`,可以提供更好的任务调度和管理,使代码更易于理解和维护。通过使用线程池,我们能够有效地利用系统资源,避免频繁创建和销毁线程带来的开销。

      C++11并发编程实战源代码

      在C++11标准中,对多线程的支持是一项重要的更新,它使得C++程序员能够更好地利用多核处理器的优势,提高程序的执行效率。 一、C++11多线程基础 C++11引入了`&lt;thread&gt;`库,用于创建和管理线程。`std::thread`类是...

      C++线程实例_C++_线程_

      通过实践上述C++线程实例,初学者可以更好地理解和掌握多线程编程的核心概念和技巧。在深入研究之前,确保理解这些基础知识是非常重要的,因为它们是构建高效并发应用程序的基础。在实际项目中,还需要考虑线程安全...

      QT多线程技术读取文档内容到程序里

      为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #...

      多线程程序例子 C++多线程 源代码 有很大的参考价值

      在C++11及其后续标准中,多线程的支持被正式引入,通过`&lt;thread&gt;`库来实现。`std::thread`类是核心组件,用于创建和管理新的线程。下面我们将深入探讨这个主题,了解如何使用C++进行多线程编程。 首先,创建一个新...

      面向对象的多线程编程

      而将面向对象编程与多线程结合,则可以更好地管理和组织复杂的多线程应用程序。 #### C++中的多线程编程 C++作为一种强大的通用编程语言,提供了多种机制来支持多线程编程。在C++11标准中引入了对线程的支持,并且...

      ThreadDemo.zip 线程应用示例

      在C++11及更高版本中,线程的支持被引入到了标准库中,通过`&lt;thread&gt;`头文件来访问。首先,我们需要包括这个头文件,并使用`std::thread`类来创建新的线程。下面是一个简单的线程创建示例: ```cpp #include ...

      C++如何创建杀死线程

      在C++中,管理线程是一项复杂但至关重要的任务,特别是在多线程编程和并发环境中。...通过深入学习上述资源,开发者可以更好地掌握C++中的线程管理和并发编程,从而构建出更强大、更稳定的软件系统。

      c++多线程实例1

      在C++编程中,多线程技术是一种提升程序并发执行能力的重要手段,它允许程序同时执行多个...通过学习这个实例,开发者可以更好地理解和应用C++的多线程特性,提高程序的并行执行效率,同时避免可能出现的线程安全问题。

      ProducerConsumer(生产者消费者问题的单线程模拟)

      生产者消费者问题是多线程编程中的经典问题,它主要探讨如何在多个线程间共享资源并协调它们的工作流程。在这个问题中,生产者...通过理解和实现这个单线程版本,开发者可以更好地理解多线程环境下的资源管理与协作。

      C++ 定时器 线程的使用

      本项目提供了一个简单的C++定时器与线程使用的示例,对于初学者来说是一个很好的学习起点。下面将详细解释这两个概念以及它们在C++中的实现方式。 首先,我们来了解一下**定时器(Timer)**。定时器主要用于在指定的...

      多线程例子 演示多线程使用

      在计算机编程中,多线程是一种并发执行任务的技术,它允许多个子任务在同一时间运行,从而提高了程序的效率和响应性。...通过分析和学习这个例子,你可以更好地理解如何在实际项目中运用多线程技术。

      线程测试(C++初学者)

      自C++11标准起,C++引入了`&lt;thread&gt;`库,提供了一种原生的线程支持。创建一个线程的基本方式如下: ```cpp #include &lt;thread&gt; void my_function() { // 这里是线程要执行的代码 } int main() { std::thread my_...

      Rust所有权的双璧:RcT与ArcT深度解析

      - **单线程**:如果程序确定只运行在单线程环境中,使用 `Rc&lt;T&gt;` 可以获得更好的性能。 - **多线程**:在多线程环境中,为了保证线程安全,应该选择 `Arc&lt;T&gt;`。 #### 五、深入理解引用计数 无论是 `Rc&lt;T&gt;` 还是 `...

      C++多线程临界区

      理解和掌握临界区是多线程编程的基础,对于初学者来说,通过编写这样的小案例,能够更好地理解线程安全和资源互斥的概念,为以后处理更复杂的并发问题打下坚实基础。 总之,C++的多线程临界区是保证并发安全的关键...

      经典c++多线程演示

      C++多线程是现代编程中的重要概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。...通过深入学习和实践这些示例,你可以提升对多线程编程的理解,并能够在实际项目中更好地应用。

      精通c++ multithread

      - **线程池**:线程池是一种管理线程的技术,可以复用一组预先创建好的线程来执行任务。这种方式可以减少创建和销毁线程的开销。 - **原子操作**:原子操作可以在无需锁的情况下执行,这对于提高并发性能至关重要。...

      QT线程使用实例.........

      本文将深入探讨QT线程的使用方法,通过一个实例来展示多线程与单线程打印数字的异同,帮助你更好地理解和应用QT中的线程功能。 首先,了解线程的基本概念。线程是程序执行的最小单位,一个进程中可以有多个线程,...

      c++多线程编译资料

      例如,你可以通过传递一个函数或成员函数指针以及它的参数来启动新线程: ```cpp #include &lt;thread&gt; void worker_function(int arg) { // 工作代码 } int main() { std::thread my_thread(worker_function, 42)...

    Global site tag (gtag.js) - Google Analytics