.NET C# 线程池

本文在这里会以一个Demo的案例介绍.NET C# 线程池开辟线程与普通模式下开辟线程的不同。
首先会对.NET C# 线程池一个大概的介绍:
直接给出书上的介绍吧。
这本书我是买的二手的,所以书上乱写的字体不是我画的,我对书做笔记是很干净的。
在这里插入图片描述
在这里插入图片描述

百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

Demo:

using System;
using System.Diagnostics;
using System.Threading;

namespace Chapter3.Recipe3
{
    
    
	class Program
	{
    
    
		static void Main(string[] args)
		{
    
    
			const int numberOfOperations = 1000;
			Stopwatch sw = new Stopwatch();
			sw.Start();
			UseThreads(numberOfOperations);
			sw.Stop();
			Console.WriteLine("Execution time using threads: "+sw.ElapsedMilliseconds);

			sw.Reset();
			sw.Start();
			UseThreadPool(numberOfOperations);
			sw.Stop();
			Console.WriteLine("Execution time using the thread pool: "+sw.ElapsedMilliseconds);
			Console.ReadKey();
		}

		static void UseThreads(int numberOfOperations)
		{
    
    
			using (CountdownEvent countdown = new CountdownEvent(numberOfOperations))
			{
    
    
				Console.WriteLine("Scheduling work by creating threads");
				for (int i = 0; i < numberOfOperations; i++)
				{
    
    
					var thread = new Thread(new ThreadStart(() =>
                    {
    
    
						Console.Write(Thread.CurrentThread.ManagedThreadId+" ");
						Thread.Sleep(TimeSpan.FromSeconds(0.1));
						countdown.Signal();
					}));
					thread.Start();
				}
				countdown.Wait();
				Console.WriteLine();
			}
		}

		static void UseThreadPool(int numberOfOperations)
		{
    
    
			using (CountdownEvent countdown = new CountdownEvent(numberOfOperations))
			{
    
    
				Console.WriteLine("Starting work on a threadpool");
				for (int i = 0; i < numberOfOperations; i++)
				{
    
    
					ThreadPool.QueueUserWorkItem(new WaitCallback( _=>
					{
    
    
						Console.Write(Thread.CurrentThread.ManagedThreadId+" ");
						Thread.Sleep(TimeSpan.FromSeconds(0.1));
						countdown.Signal();
					}));
					//ThreadPool.QueueUserWorkItem( _ => 
					//{
    
    
					//    Console.Write(Thread.CurrentThread.ManagedThreadId);
					//    Thread.Sleep(TimeSpan.FromSeconds(0.1));
					//    countdown.Signal();
					//});
				}
				countdown.Wait();
				Console.WriteLine();
			}
		}
	}
}

对于该demo的介绍:
在这里插入图片描述
更多的时间。
我们为操作系统节省了内存和线程数,但是为此付出了更长的执行时间。
以下为控制台打印结果:
Scheduling work by creating threads
10 11 12 13 15 14 16 17 18 19 20 21 22 23 24 26 25 27 28 30 31 29 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 63 62 65 66 64 67 68 69 70 71 73 72 74 75 76 77 78 79 80 81 82 84 85 83 86 87 89 88 90 92 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 109 111 112 113 114 115 116 119 117 118 120 122 121 124 123 127 125 126 128 129 130 131 133 132 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 153 152 155 154 156 158 157 159 160 161 162 163 164 167 166 168 165 169 170 172 171 173 174 175 176 178 177 179 181 182 180 183 184 187 185 186 190 189 188 191 192 193 195 194 197 198 196 199 200 201 202 203 204 205 206 207 208 210 211 209 212 213 214 215 216 217 218 219 220 221 223 225 224 226 222 227 228 229 230 232 231 233 234 235 236 237 239 238 240 242 241 243 244 245 247 246 248 250 249 251 252 253 254 255 256 257 258 259 260 261 262 263 265 264 266 268 269 267 270 272 273 274 271 276 275 277 278 279 281 280 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 299 297 300 298 301 304 302 303 305 306 307 309 308 310 311 313 312 314 316 315 317 318 319 320 321 323 322 324 327 325 328 326 329 330 334 335 331 332 333 336 337 338 339 340 328 327 325 326 324 323 322 321 320 319 317 318 316 315 314 313 312 311 310 309 306 305 308 307 303 302 304 301 299 300 298 297 296 295 294 293 292 291 290 288 287 289 285 286 284 283 282 281 280 279 278 277 274 276 275 273 272 271 270 269 268 267 266 265 264 263 262 261 260 259 258 257 256 255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 239 237 238 236 240 235 234 233 232 231 230 229 228 226 227 225 224 223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 207 206 205 204 203 201 202 199 198 200 196 197 195 194 193 191 192 190 189 187 188 186 185 184 183 182 181 180 179 178 177 176 175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 159 160 158 157 156 155 154 152 153 151 150 149 148 147 146 143 145 141 144 142 140 138 139 137 136 134 131 133 135 132 130 129 128 127 126 125 124 123 122 121 120 119 118 117 115 116 114 113 111 112 109 110 108 106 107 105 104 103 102 100 101 98 99 97 95 96 94 92 93 91 90 89 88 87 86 85 84 83 81 82 80 79 78 77 76 75 74 73 71 72 68 70 69 67 66 63 64 65 61 62 60 59 58 57 56 53 55 54 52 51 50 49 48 47 46 45 44 43 42 41 40 38 37 39 36 35 34 33 32 31 30 29 28 26 27 24 25 23 22 21 19 17 18 20 16 14 15 13 12 10 11 341 342 343 344 345 347 346 348 349 350 351 353 352 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 386 387 385 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 409 410 408 411 413 414 412 415 416 417 418 419 420 421 422 423 424 425 427 426 429 430 428 431 432 433 435 434 436 437 438 440 439 441 442 444 445 443 446 447 448 449 450 451 452 453 454 456 455 457 458 459 460 461 462 463 464 465 466 470 468 467 471 469 472 474 473 476 475 477 478 479 480 482 481 483 484 485 486 487 488 489 491 490 492 493 494 496 497 498 500 499 495 501 502 503 504 505 506 507 508 509 510 511 512 513 514 516 515 517 518 519 520 521 522 523 524 525 527 526 528 530 531 529 532 534 535 533 536 537 539 540 538 541 543 545 544 542 548 546 547 549 551 550 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 579 580 578 581 582 583 584 585 587 586 588 590 589 591 593 592 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 610 609 611 612 613 614 615 617 616 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 635 636 634 637 639 638 640 641 643 642 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 674 672 673 677 675 676 678 679 680 681 682 684 685 683 686 687 689 688 690
Execution time using threads: 12479
Starting work on a threadpool
691 694 692 693 691 694 692 693 691 694 692 693 691 694 692 693 691 694 692 693 691 694 692 693 691 695 694 693 692 691 695 694 693 692 695 691 694 693 692 691 695 694 693 692 691 695 694 693 692 695 691 694 693 692 691 695 694 693 692 695 691 694 693 692 695 691 694 692 693 695 691 694 693 692 691 695 694 693 692 695 694 692 693 695 694 692 693 695 694 692 693 695 694 692 693 695 694 693 692 695 694 692 693 695 694 692 693 695 694 692 693 695 694 692 693 695 694 692 693 695 694 692 691 693 695 694 691 693 692 695 694 693 691 692 695 694 693 691 692 695 694 691 693 692 695 694 693 691 692 695 694 691 693 692 695 694 693 691 692 695 694 692 691 693 695 694 692 691 693 695 694 691 692 693 695 694 692 691 695 694 692 691 695 694 691 692 695 694 692 691 695 694 692 691 695 694 691 692 695 694 692 691 695 694 692 691 695 694 691 692 695 694 691 692 695 694 691 692 693 695 696 698 697 694 692 691 698 696 697 693 695 694 691 692 693 696 697 698 695 694 691 692 695 696 698 697 693 694 691 692 697 696 695 698 693 694 691 692 695 698 696 697 693 694 692 691 696 693 697 695 698 694 691 692 697 693 696 695 698 694 691 692 693 696 697 695 698 694 691 692 695 697 693 696 698 694 691 692 693 695 696 697 698 694 691 692 696 697 695 693 698 694 691 692 693 695 697 696 696 697 695 693 695 696 693 697 695 697 693 696 696 693 697 695 697 696 695 693 693 697 695 696 697 695 696 693 695 696 693 697 696 693 695 697 695 691 692 693 694 698 696 697 695 697 693 692 691 696 698 694 695 694 696 698 691 693 692 697 695 696 698 694 692 697 693 691 695 698 696 694 693 691 692 697 695 696 698 694 697 693 692 691 695 694 696 698 692 693 691 697 699 695 698 694 696 697 693 699 691 692 695 694 696 698 691 692 693 697 699 695 696 694 698 699 693 697 692 691 695 694 696 698 697 693 699 691 692 695 694 696 698 692 691 697 699 693 695 696 698 694 693 699 691 692 697 697 691 692 699 693 693 692 699 697 691 699 691 692 697 693 697 693 691 692 699 692 697 693 699 691 699 697 692 693 691 693 691 697 692 699 697 692 691 693 699 699 697 693 692 691 692 691 697 699 693 693 695 697 692 696 691 699 694 700 698 693 695 699 698 692 697 696 694 691 700 700 699 694 696 692 697 691 693 695 698 695 694 691 697 700 692 698 699 696 693 691 695 697 694 696 698 692 693 700 699 697 694 691 695 700 692 699 696 698 693 691 694 695 697 698 693 699 692 700 696 694 697 695 691 700 698 692 699 696 693 691 695 697 694 696 692 693 699 698 700 697 691 695 694 698 692 700 693 696 699 695 691 694 697 693 692 698 699 700 696 694 697 695 691 692 696 693 698 699 700 697 694 691 695 692 700 693 699 696 698 695 697 694 691 692 698 696 699 697 695 692 699 696 698 695 697 692 696 698 699 695 697 692 698 696 699 695 697 692 699 696 698 695 697 692 696 699 698 697 695 692 698 699 696 697 695 692 699 698 696 695 697 692 699 696 698 695 697 692 696 699 698 695 697 692 699 698 696 695 697 692 698 700 699 694 696 693 691 702 701 697 695 692 691 699 700 702 696 693 694 698 701 695 697 692 693 694 698 691 696 702 700 699 701 695 697 692 696 691 698 694 702 700 693 699 701 695 697 692 696 700 698 691 702 693 694 699 701 695 697 692 691 698 696 702 700 694 693 701 699 695 697 692 696 702 700 691 698 701 694 693 699 695 697 703 692 698 696 700 691 702 693 701 694 699 695 703 697 692 700 691 696 702 698 699 694 701 693 695 703 697 692 698 696 691 702 700 694 693 701 699 703 697 695 692 702 700 691 696 698 701 693 694 699 697 703 695 692 698 700 691 696 702 694 701 699 693 695 703 697 692 696 700 691 702 698 699 694 693 701 697 703 695 692 698 691 699 695 703 697 692 691 698 699 697 703 695 692 691 698 699 703 697 695 692 698 691 699 703 697 695 692 698 691 699 703 697 695 692 698 691 699 695 703 697 692 691 698 699 697 703 695 692 691 698 699 695 703 697 692 691 698 699 703 697 695 692 691 698 699 703 697 695 692 691 698 699 695 703 697 692 691 696 694 693 699 700 704 698 701 702 705 697 695 703 692 702 704 698 699 700 694 701 696 691 693 705 695 697 703 692 696 691 704 699 700 694 702 698 701 693 705 697 703 695
Execution time using the thread pool: 15975

普通方法开辟1000线程并连续执行,然后依次关闭耗时 12479 mm
但是CPU和内存拉满:
在这里插入图片描述

线程池耗时 15975 mm
但是CPU和内存耗费相当少:
在这里插入图片描述
事实上,当修改循环次数numberOfOperations 改小时,普通方法与线程池方法之间耗时差异更大。
但是耗费的CPU算力和内存依然相差很大。
numberOfOperations 增大时,普通方法与线程池方法之间耗时差异会逐渐缩小,线程池在循环次数变得更大时耗时会变得更短。普通方法CPU算力和内存依然占满,而线程池方法只占用很少的CPU算力和内存。
从这里就可以看出线程池的优势了。

对比如下:
numberOfOperations 为250时:
普通方法耗时:3532 mm,CPU占用100%
线程池方法耗时:5980 mm,CPU占用6%

numberOfOperations 为500时:
普通方法耗时:6230mm,CPU占用100%
线程池方法耗时:10240mm,CPU占用8%

numberOfOperations 为1000时:
普通方法耗时:12734mm,CPU占用100%
线程池方法耗时:15710 mm,CPU占用9%

numberOfOperations 为2000时:
普通方法耗时:23858 mm,CPU占用100%
线程池方法耗时:23699 mm,CPU占用8%

numberOfOperations 为4000时:
普通方法耗时:50706 mm,CPU占用100%
线程池方法耗时:37933 mm,CPU占用8%

关于以上DEMO 中CountDownEvent的使用,请大家自行百度下,有博主比我讲的更好。

猜你喜欢

转载自blog.csdn.net/m0_47472749/article/details/121244273