上接稳扎稳打Silverlight(26) - 2.0线程之Lock, Interlocked, EventWaitHandle, Monitor

简介:


3、EventWaitHandle.xaml

<UserControl x:Class="Silverlight20.Thread.EventWaitHandle" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <TextBlock x:Name="txtAutoResetEvent" /> 
                 
                <TextBlock x:Name="txtManualResetEvent" /> 

        </StackPanel> 
</UserControl>
 
EventWaitHandle.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
namespace Silverlight20.Thread 

         public partial  class EventWaitHandle : UserControl 
        { 
                 // AutoResetEvent(bool state) - 通知其他线程是否可入的类,自动 Reset() 
                 //         bool state - 是否为终止状态,即是否禁止其他线程入内 
                 private System.Threading.AutoResetEvent autoResetEvent =    
                         new System.Threading.AutoResetEvent( false); 
 
                 // ManualResetEvent(bool state) - 通知其他线程是否可入的类,手动 Reset() 
                 //         bool state - 是否为终止状态,即是否禁止其他线程入内 
                 private System.Threading.ManualResetEvent manualResetEvent =    
                         new System.Threading.ManualResetEvent( false); 
 
                 private  static  int i; 
 
                 public EventWaitHandle() 
                { 
                        InitializeComponent(); 
 
                         // 演示 AutoResetEvent 
                        AutoResetEventDemo(); 
 
                         // 演示 ManualResetEvent 
                        ManualResetEventDemo(); 
                } 
 
                 private  void AutoResetEventDemo() 
                { 
                        i = 0; 
 
                         for ( int x = 0; x < 100; x++) 
                        { 
                                 // 开 100 个线程去操作静态变量 i 
                                System.Threading.Thread thread = 
                                         new System.Threading.Thread( new System.Threading.ThreadStart(AutoResetEventDemoCallback)); 
                                thread.Start(); 
 
                                 // 阻塞当前线程,直到 AutoResetEvent 发出 Set() 信号 
                                autoResetEvent.WaitOne(); 
                        } 
 
                        System.Threading.Thread.Sleep(1000); 
                         // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果 
                        txtAutoResetEvent.Text = i.ToString(); 
                } 
 
                 private  void AutoResetEventDemoCallback() 
                { 
                         try 
                        { 
                                 int j = i + 1; 
 
                                 // 模拟多线程并发操作静态变量 i 的情况 
                                System.Threading.Thread.Sleep(5); 
 
                                i = j; 
                        } 
                         finally 
                        { 
                                 // 发出 Set() 信号,以释放 AutoResetEvent 所阻塞的线程 
                                autoResetEvent.Set(); 
                        } 
                } 
 
 
                 private  void ManualResetEventDemo() 
                { 
                        i = 0; 
 
                         for ( int x = 0; x < 100; x++) 
                        { 
                                 // Reset() - 将 ManualResetEvent 变为非终止状态,即由此线程控制 ManualResetEvent, 
                                 //         其他线程排队,直到 ManualResetEvent 发出 Set() 信号(AutoResetEvent 在 Set() 时会自动 Reset()) 
                                manualResetEvent.Reset(); 
 
                                 // 开 100 个线程去操作静态变量 i 
                                System.Threading.Thread thread = 
                                         new System.Threading.Thread( new System.Threading.ThreadStart(ManualResetEventDemoCallback)); 
                                thread.Start(); 
 
                                 // 阻塞当前线程,直到 ManualResetEvent 发出 Set() 信号 
                                manualResetEvent.WaitOne(); 
                        } 
 
                        System.Threading.Thread.Sleep(1000); 
                         // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果 
                        txtManualResetEvent.Text = i.ToString(); 
                } 
 
                 private  void ManualResetEventDemoCallback() 
                { 
                         try 
                        { 
                                 int j = i + 1; 
 
                                 // 模拟多线程并发操作静态变量 i 的情况 
                                System.Threading.Thread.Sleep(5); 
 
                                i = j; 
                        } 
                         finally 
                        { 
                                 // 发出 Set() 信号,以释放 ManualResetEvent 所阻塞的线程,同时 ManualResetEvent 变为终止状态) 
                                manualResetEvent.Set(); 
                        } 
                } 
        } 
}
 
 
4、Monitor.xaml
<UserControl x:Class="Silverlight20.Thread.Monitor" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <TextBlock x:Name="txtMsg" /> 

        </StackPanel> 
</UserControl>
 
Monitor.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
namespace Silverlight20.Thread 

         public partial  class Monitor : UserControl 
        { 
                 private  static  readonly  object objLock =  new  object(); 
                 private  static  int i; 
                 
                 public Monitor() 
                { 
                        InitializeComponent(); 
 
                        i = 0; 
 
                         for ( int x = 0; x < 100; x++) 
                        { 
                                 // 开 100 个线程去操作静态变量 i 
                                System.Threading.Thread thread =  new System.Threading.Thread( new System.Threading.ThreadStart(DoWork)); 
                                thread.Start(); 
                        } 
 
                        System.Threading.Thread.Sleep(1000); 
                         // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果 
                        txtMsg.Text = i.ToString(); 
                } 
 
                 private  void DoWork() 
                { 
                         try 
                        { 
                                 // Monitor - 提供同步访问对象的机制 
 
                                 // Enter() - 在指定对象上获取排他锁 
                                System.Threading.Monitor.Enter(objLock); 
 
                                 int j = i + 1; 
 
                                 // 模拟多线程并发操作静态变量 i 的情况 
                                System.Threading.Thread.Sleep(5); 
 
                                i = j; 
 
                                 // Exit() - 释放指定对象上的排他锁 
                                System.Threading.Monitor.Exit(objLock); 
                        } 
                         finally 
                        { 
                                 // code 
                        } 
                } 
        } 
}
 
 

5、ThreadStaticAttribute.xaml
<UserControl x:Class="Silverlight20.Thread.ThreadStaticAttribute" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 
         
                <TextBlock x:Name="txtMsg" /> 
                 
                <TextBlock x:Name="txtMsg2" /> 

        </StackPanel> 
</UserControl>
 
ThreadStaticAttribute.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
namespace Silverlight20.Thread 

         public partial  class ThreadStaticAttribute : UserControl 
        { 
                 // ThreadStatic - 所指定的静态变量对每个线程都是唯一的 
                [System.ThreadStatic] 
                 private  static  int value; 
 
                 // 一般的静态变量,对每个线程都是共用的 
                 private  static  int value2; 
 
                 public ThreadStaticAttribute() 
                { 
                        InitializeComponent(); 
 
                        Demo(); 
                } 
 
                 void Demo() 
                { 
                        System.Threading.Thread thread =  new System.Threading.Thread(DoWork); 
                        thread.Name =  "线程1"
                        thread.Start(); 
 
                        System.Threading.Thread.Sleep(100); 
 
                        System.Threading.Thread thread2 =  new System.Threading.Thread(DoWork2); 
                        thread2.Name =  "线程2"
                        thread2.Start(); 
 
                } 
 
                 void DoWork() 
                { 
                         for ( int i = 0; i < 10; i++) 
                        { 
                                 // 线程1对静态变量的操作 
                                value++; 
                                value2++; 
                        } 
 
                         string s = value.ToString();  // value - 本线程独有的静态变量 
                         string s2 = value2.ToString();  // value2 - 所有线程共用的静态变量 
 
                         this.Dispatcher.BeginInvoke( delegate { txtMsg.Text = s +  " - " + s2; }); 
                         // this.Dispatcher.BeginInvoke(delegate { txtMsg.Text = value + " - " + value2; }); // 在UI线程上调用,所以value值为UI线程上的value值,即 0    
                } 
 
                 void DoWork2() 
                { 
                         for ( int i = 0; i < 10; i++) 
                        { 
                                 // 线程2对静态变量的操作 
                                value++; 
                                value2++; 
                        } 
 
                         string s = value.ToString();  // value - 本线程独有的静态变量 
                         string s2 = value2.ToString();  // value2 - 所有线程共用的静态变量 
 
                         this.Dispatcher.BeginInvoke( delegate { txtMsg2.Text = s +  " - " + s2; }); 
                         // this.Dispatcher.BeginInvoke(delegate { txtMsg2.Text = value + " - " + value2; }); // 在UI线程上调用,所以value值为UI线程上的value值,即 0    
                } 
        } 
}
 
 


     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/343911 ,如需转载请自行联系原作者

 
相关文章
|
5月前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
98 5
|
2月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
52 4
|
3月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
35 2
|
4月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
50 7
|
5月前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
92 5
|
5月前
|
Java 开发者
揭秘!为什么大神都爱用Lock接口处理线程同步?
揭秘!为什么大神都爱用Lock接口处理线程同步?
86 5
|
5月前
|
Java
在Java多线程领域,精通Lock接口是成为高手的关键。
在Java多线程领域,精通Lock接口是成为高手的关键。相较于传统的`synchronized`,Lock接口自Java 5.0起提供了更灵活的线程同步机制,包括可中断等待、超时等待及公平锁选择等高级功能。本文通过实战演练介绍Lock接口的核心实现——ReentrantLock,并演示如何使用Condition进行精确线程控制,帮助你掌握这一武林秘籍,成为Java多线程领域的盟主。示例代码展示了ReentrantLock的基本用法及Condition在生产者-消费者模式中的应用,助你提升程序效率和稳定性。
57 2
|
5月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
33 2
|
5月前
|
Java
多线程同步新姿势:Lock接口助你“一统江湖”!
多线程同步新姿势:Lock接口助你“一统江湖”!
54 2
|
5月前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
110 1