Thread 类案例分析

简介:   1、一些Thread基本理论   一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托或 ParameterizedThreadStart 委托指定由线程执行的程序代码。

 

1、一些Thread基本理论

  一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托或 ParameterizedThreadStart 委托指定由线程执行的程序代码。使用 ParameterizedThreadStart 委托可以将数据传递到线程过程。

  在线程存在期间,它总是处于由 ThreadState 定义的一个或多个状态中。可以为线程请求由 ThreadPriority 定义的调度优先级,但不能保证操作系统会接受该优先级。

GetHashCode 提供托管线程的标识。在线程的生存期内,无论获取该值的应用程序域如何,它都不会和任何来自其他线程的值冲突。

 

2、案例代码分析

在主线程中调用其它线程,执行的过程有取决于操作系统的调度及时间的分配。

   图1,t.join()开启时,调用t的主线程main主线程会被阻塞,等待t线程执行完才去执行最后一句控制台输出;

   图2,t.join()关闭,调用t的主线程main主线程会不会阻塞,执行最后一台控制台输出完全不受T线程限制,没等t线程执行完就输出了;

   图3,t.start()后加了一个Thread.sleep(1),使main主线程休眠1秒(期间t线程照常执行)。


 


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;

  6. namespace Threaddeom
  7. {

  8.     ///
  9.     /// Simple threading scenario: Start a static method running
  10.     /// on a second thread.
  11.     ///
  12.     public class ThreadExample
  13.     {

  14.         ///
  15.         /// The ThreadProc method is called when the thread starts.
  16.         /// It loops ten times, writing to the console and yielding 
  17.         /// the rest of its time slice(时间片) each time, and then ends.
  18.         ///
  19.         public static void ThreadProc()
  20.         {
  21.             for (int i = 0; i 10; i++)

  22.             {
  23.                 Console.WriteLine("ThreadProc: {0}", i);
  24.                 /* Yield the rest of the time slice. */
  25.                 Thread.Sleep(0);
  26.             }
  27.         }

  28.         class Program
  29.         {
  30.             static void Main(string[] args)
  31.             {
  32.                 while (true)
  33.                 {
  34.                     Console.WriteLine("Main thread: Start a second thread.");
  35.                     /*
  36.                     * The constructor for the Thread class requires a ThreadStart
  37.                     * delegate that represents the method to be executed on the
  38.                     * thread. C# simplifies the creation of this delegate,简化了委托的创建.
  39.                      */
  40.                     Thread t = new Thread(new ThreadStart(ThreadProc));
  41.                     /*
  42.                     * Start ThreadProc. Note that on a uniprocessor, the new
  43.                     * thread does not get any processor time until the main thread
  44.                     * is preempted or yields. Uncomment the Thread.Sleep that
  45.                     * follows t.Start() to see the difference.
  46.                      */
  47.                     t.Start();
  48.                     /* 通过Thread.Sleep可以让主线程休眠,从而优先完次线程的内容 */
  49.                     //Thread.Sleep(1);

  50.                     for (int i = 0; i 4; i++)
  51.                     {
  52.                         Console.WriteLine("Main thread: Do some work.");
  53.                         Thread.Sleep(0);
  54.                     }

  55.                     Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
  56.                     /* 确保线程执行完之后,才执行下面主线程的控制台输出 */
  57.                     t.Join();
  58.                     Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
  59.                     Console.ReadLine();

  60.                     Console.Clear();
  61.                 }
  62.             }
  63.         }
  64.     }
  65. }

 

 

image

                               图1 join开启

 

image

                            图2 join关闭

 

image

                        图3 Thread.sleep(1)开启


4、源工程代码

rar.gif Threaddemo.rar   


相关文章
|
3月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
6月前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
64 2
|
7月前
|
Java Linux API
Java多线程基础-4:详解Thread类及其基本用法 (一)
Java 中的 `Thread` 类是用来管理线程的,每个线程都是通过 `Thread` 类的对象来描述。
309 0
|
7月前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
7月前
|
资源调度 调度
Thread的基本方法(3)-yield方法的分析与实例说明
Thread的基本方法(3)-yield方法的分析与实例说明
77 0
Thread 类的基本用法
比较推荐:使用 lambda 表达式创建线程的时候不用重写 run 方法。 不需要显式重写run方法的原因是因为线程的目标方法已经在Lambda表达式中定义了。Lambda表达式是一种用于创建匿名函数的语法糖,它可以将一个方法(或一段代码块)包装为一个函数对象。当您使用Lambda表达式创建线程时,Lambda表达式的内容会被视为线程执行的任务,这个任务会自动成为run方法的实现。
82 0
|
Java 调度
Thread类的方法
Thread类的方法
43 0
|
调度
Thread 类的基本方法
Thread 类的基本方法
89 0
测试Thread中的常用方法
测试Thread中的常用方法
71 0
|
Java
多线程的创建的方式一:继承于Thread类
多线程的创建的方式一:继承于Thread类
55 0