稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

简介:



[索引页]

[源码下载]


稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool


作者: webabcd


介绍
Silverlight 2.0 使用Thread, Timer, BackgroundWorker, ThreadPool来实现多线程开发
    Thread - 用于线程的创建和控制的类
    Timer - 用于以指定的时间间隔执行指定的方法的类
    BackgroundWorker - 用于在单独的线程上运行操作
    ThreadPool - 线程池的管理类


在线DEMO
http://webabcd.blog.51cto.com/1787395/342779


示例
1、Thread.xaml
<UserControl x:Class="Silverlight20.Thread.Thread" 
        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>
 
Thread.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace Silverlight20.Thread 
InBlock.gif
InBlock.gif         public partial  class Thread : UserControl 
InBlock.gif        { 
InBlock.gif                 string result = ""; 
InBlock.gif 
InBlock.gif                 public Thread() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                        Demo(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void Demo() 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * Thread - 用于线程的创建和控制的类 
InBlock.gif                         *         Name - 线程名称 
InBlock.gif                         *         IsBackground - 是否是后台线程(对于Silverlight来说,是否是后台线程没区别) 
InBlock.gif                         *         Start(object parameter) - 启动后台线程 
InBlock.gif                         *                 object parameter - 为后台线程传递的参数 
InBlock.gif                         *         IsAlive - 线程是否在执行中 
InBlock.gif                         *         ManagedThreadId - 当前托管线程的唯一标识符 
InBlock.gif                         *         ThreadState - 指定线程的状态 [System.Threading.ThreadState枚举] 
InBlock.gif                         *         Abort() - 终止线程 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                         // DoWork 是后台线程所执行的方法(此处省略掉了委托类型) 
InBlock.gif                         // ThreadStart 委托不可以带参数, ParameterizedThreadStart 委托可以带参数 
InBlock.gif                        System.Threading.Thread thread =  new System.Threading.Thread(DoWork); 
InBlock.gif                        thread.Name =  "ThreadDemo"
InBlock.gif                        thread.IsBackground =  true
InBlock.gif                        thread.Start(1000); 
InBlock.gif 
InBlock.gif                        result += thread.IsAlive +  "\r\n"
InBlock.gif                        result += thread.ManagedThreadId +  "\r\n"
InBlock.gif                        result += thread.Name +  "\r\n"
InBlock.gif                        result += thread.ThreadState +  "\r\n"
InBlock.gif 
InBlock.gif                         // thread.Join(); 阻塞调用线程(本例为主线程),直到指定线程(本例为thread)执行完毕为止 
InBlock.gif 
InBlock.gif                         // 阻塞调用线程(本例为主线程) 
InBlock.gif                         // 如果指定线程执行完毕则继续(本例为thread执行完毕则继续) 
InBlock.gif                         // 如果指定线程运行的时间超过指定时间则继续(本例为thread执行时间如果超过5秒则继续) 
InBlock.gif                         // 返回值为在指定时间内指定线程是否执行完毕(本例中thread的执行时间为1秒,所以会返回true)
InBlock.gif                         if (thread.Join(5000))    
InBlock.gif                        { 
InBlock.gif                                result +=  "指定线程在5秒内执行完毕\r\n"
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        txtMsg.Text = result; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void DoWork( object sleepMillisecond) 
InBlock.gif                { 
InBlock.gif                        System.Threading.Thread.Sleep(( int)sleepMillisecond); 
InBlock.gif 
InBlock.gif                        result +=  "新开线程执行完毕\r\n"
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
2、Timer.xaml
<UserControl x:Class="Silverlight20.Thread.Timer" 
        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>
 
Timer.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace Silverlight20.Thread 
InBlock.gif
InBlock.gif         public partial  class Timer : UserControl 
InBlock.gif        { 
InBlock.gif                System.Threading.SynchronizationContext _syncContext; 
InBlock.gif                 // Timer - 用于以指定的时间间隔执行指定的方法的类 
InBlock.gif                System.Threading.Timer _timer; 
InBlock.gif                 private  int _flag = 0; 
InBlock.gif 
InBlock.gif                 public Timer() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                         // UI 线程 
InBlock.gif                        _syncContext = System.Threading.SynchronizationContext.Current; 
InBlock.gif 
InBlock.gif                        Demo(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void Demo() 
InBlock.gif                { 
InBlock.gif                         // 输出当前时间 
InBlock.gif                        txtMsg.Text = DateTime.Now.ToString() +  "\r\n"
InBlock.gif 
InBlock.gif                         // 第一个参数:定时器需要调用的方法 
InBlock.gif                         // 第二个参数:传给需要调用的方法的参数 
InBlock.gif                         // 第三个参数:此时间后启动定时器 
InBlock.gif                         // 第四个参数:调用指定方法的间隔时间(System.Threading.Timeout.Infinite 为无穷大) 
InBlock.gif                        _timer =  new System.Threading.Timer(MyTimerCallback,  "webabcd", 3000, 1000); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void MyTimerCallback( object state) 
InBlock.gif                { 
InBlock.gif                         string result =  string.Format( "{0} - {1}\r\n", DateTime.Now.ToString(), ( string)state); 
InBlock.gif 
InBlock.gif                         // 调用 UI 线程。不会做自动线程同步 
InBlock.gif                        _syncContext.Post( delegate { txtMsg.Text += result; },  null);    
InBlock.gif 
InBlock.gif                        _flag++; 
InBlock.gif                         if (_flag == 5) 
InBlock.gif                                _timer.Change(5000, 500);  // 执行5次后,计时器重置为5秒后启动,每5毫秒的间隔时间执行一次指定的方法 
InBlock.gif                         else  if (_flag == 10) 
InBlock.gif                                _timer.Dispose();  // 执行10次后,释放计时器所使用的全部资源 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
3、BackgroundWorker.xaml
<UserControl x:Class="Silverlight20.Thread.BackgroundWorker" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <StackPanel Orientation="Horizontal" Margin="5"> 
                        <Button x:Name="btnStart" Content="开始" Margin="5" Click="btnStart_Click" /> 
                        <Button x:Name="btnCancel" Content="取消" Margin="5" Click="btnCancel_Click" /> 
                </StackPanel> 
                 
                <StackPanel Margin="5"> 
                        <TextBlock x:Name="txtProgress" Margin="5" /> 
                        <TextBlock x:Name="txtMsg" Margin="5" /> 
                </StackPanel> 

        </StackPanel>    
</UserControl>
 
BackgroundWorker.xaml.cs
InBlock.gif /* 
InBlock.gif * 演示用 BackgroundWorker 在后台线程上执行耗时的操作 
InBlock.gif * 按“开始”键,开始在后台线程执行耗时操作,并向UI线程汇报执行进度 
InBlock.gif * 按“取消”键,终止后台线程 
InBlock.gif * BackgroundWorker 调用 UI 线程时会自动做线程同步 
InBlock.gif */
 
InBlock.gif 
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace Silverlight20.Thread 
InBlock.gif
InBlock.gif         public partial  class BackgroundWorker : UserControl 
InBlock.gif        { 
InBlock.gif                 // BackgroundWorker - 用于在单独的线程上运行操作。例如可以在非UI线程上运行耗时操作,以避免UI停止响应 
InBlock.gif                System.ComponentModel.BackgroundWorker _backgroundWorker; 
InBlock.gif 
InBlock.gif                 public BackgroundWorker() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                        BackgroundWorkerDemo(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void BackgroundWorkerDemo() 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * WorkerSupportsCancellation - 是否支持在其他线程中取消该线程的操作 
InBlock.gif                         * WorkerReportsProgress - 是否可以报告操作进度 
InBlock.gif                         * ProgressChanged - 报告操作进度时触发的事件 
InBlock.gif                         * DoWork - BackgroundWorker 调用 RunWorkerAsync() 方法时触发的事件。在此执行具体操作 
InBlock.gif                         * RunWorkerCompleted - 操作完成/取消/出错时触发的事件 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                        _backgroundWorker =  new System.ComponentModel.BackgroundWorker(); 
InBlock.gif 
InBlock.gif                        _backgroundWorker.WorkerSupportsCancellation =  true
InBlock.gif                        _backgroundWorker.WorkerReportsProgress =  true
InBlock.gif 
InBlock.gif                        _backgroundWorker.ProgressChanged +=  new System.ComponentModel.ProgressChangedEventHandler(_backgroundWorker_ProgressChanged); 
InBlock.gif                        _backgroundWorker.DoWork +=  new System.ComponentModel.DoWorkEventHandler(_backgroundWorker_DoWork); 
InBlock.gif                        _backgroundWorker.RunWorkerCompleted +=  new System.ComponentModel.RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void btnStart_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // IsBusy - 指定的 BackgroundWorker 是否正在后台操作 
InBlock.gif                         // RunWorkerAsync(object argument) - 开始在后台线程执行指定的操作 
InBlock.gif                         //         object argument - 需要传递到 DoWork 的参数 
InBlock.gif                         if (!_backgroundWorker.IsBusy) 
InBlock.gif                                _backgroundWorker.RunWorkerAsync( "需要传递的参数"); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void btnCancel_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // CancelAsync() - 取消 BackgroundWorker 正在执行的后台操作 
InBlock.gif                         if (_backgroundWorker.WorkerSupportsCancellation) 
InBlock.gif                                _backgroundWorker.CancelAsync(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void _backgroundWorker_DoWork( object sender, System.ComponentModel.DoWorkEventArgs e) 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * DoWorkEventArgs.Argument - RunWorkerAsync(object argument)传递过来的参数 
InBlock.gif                         * DoWorkEventArgs.Cancel - 取消操作 
InBlock.gif                         * DoWorkEventArgs.Result - 操作的结果。将传递到 RunWorkerCompleted 所指定的方法 
InBlock.gif                         * BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 汇报操作的完成进度 
InBlock.gif                         *         int percentProgress - 操作完成的百分比 1% - 100% 
InBlock.gif                         *         object userState - 传递到 ProgressChanged 的参数 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                         for ( int i = 0; i < 10; i++) 
InBlock.gif                        { 
InBlock.gif                                 if ((_backgroundWorker.CancellationPending ==  true)) 
InBlock.gif                                { 
InBlock.gif                                        e.Cancel =  true
InBlock.gif                                         break
InBlock.gif                                } 
InBlock.gif                                 else 
InBlock.gif                                { 
InBlock.gif                                        System.Threading.Thread.Sleep(1000); 
InBlock.gif                                        _backgroundWorker.ReportProgress((i + 1) * 10, i); 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        e.Result =  "操作已完成"
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void _backgroundWorker_ProgressChanged( object sender, System.ComponentModel.ProgressChangedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // ProgressChangedEventArgs.ProgressPercentage - ReportProgress 传递过来的操作完成的百分比 
InBlock.gif                         // ProgressChangedEventArgs.UserState - ReportProgress 传递过来的参数 
InBlock.gif                        txtProgress.Text =  string.Format( "完成进度:{0}%;参数:{1}"
InBlock.gif                                e.ProgressPercentage, 
InBlock.gif                                e.UserState); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void _backgroundWorker_RunWorkerCompleted( object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         /* 
InBlock.gif                         * RunWorkerCompletedEventArgs.Error - DoWork 时产生的错误 
InBlock.gif                         * RunWorkerCompletedEventArgs.Cancelled - 后台操作是否已被取消 
InBlock.gif                         * RunWorkerCompletedEventArgs.Result - DoWork 的结果 
InBlock.gif                         */
 
InBlock.gif 
InBlock.gif                         if (e.Error !=  null
InBlock.gif                        { 
InBlock.gif                                txtMsg.Text += e.Error.ToString() +  "\r\n"
InBlock.gif                        } 
InBlock.gif                         else  if (e.Cancelled) 
InBlock.gif                        { 
InBlock.gif                                txtMsg.Text +=  "操作被取消\r\n"
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                txtMsg.Text += e.Result.ToString() +  "\r\n"
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
 
4、ThreadPool.xaml
<UserControl x:Class="Silverlight20.Thread.ThreadPool" 
        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="txtMsgQueueUserWorkItem" Text="click here" MouseLeftButtonDown="txtMsgQueueUserWorkItem_MouseLeftButtonDown" Margin="30" /> 

                <TextBlock x:Name="txtRegisterWaitForSingleObject" Text="click here" MouseLeftButtonDown="txtRegisterWaitForSingleObject_MouseLeftButtonDown" Margin="30" /> 

        </StackPanel> 
</UserControl>
 
ThreadPool.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace Silverlight20.Thread 
InBlock.gif
InBlock.gif         public partial  class ThreadPool : UserControl 
InBlock.gif        { 
InBlock.gif                 public ThreadPool() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void txtMsgQueueUserWorkItem_MouseLeftButtonDown( object sender, MouseButtonEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // ThreadPool - 线程池的管理类 
InBlock.gif 
InBlock.gif                         // QueueUserWorkItem(WaitCallback callBack, Object state) - 将指定方法加入线程池队列 
InBlock.gif                         //         WaitCallback callBack - 需要在新开线程里执行的方法 
InBlock.gif                         //         Object state - 传递给指定方法的参数 
InBlock.gif                        System.Threading.ThreadPool.QueueUserWorkItem(DoWork, DateTime.Now); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void DoWork( object state) 
InBlock.gif                { 
InBlock.gif                         // 作为线程管理策略的一部分,线程池在创建线程前会有一定的延迟 
InBlock.gif                         // 也就是说线程入队列的时间和线程启动的时间之间有一定的间隔 
InBlock.gif 
InBlock.gif                        DateTime dtJoin = (DateTime)state; 
InBlock.gif                        DateTime dtStart = DateTime.Now; 
InBlock.gif                        System.Threading.Thread.Sleep(3000); 
InBlock.gif                        DateTime dtEnd = DateTime.Now; 
InBlock.gif 
InBlock.gif                         // Dispatcher.BeginInvoke() - 在与 Dispatcher 相关联的线程上执行指定的操作。自动线程同步 
InBlock.gif                         this.Dispatcher.BeginInvoke(() => 
InBlock.gif                        { 
InBlock.gif                                txtMsgQueueUserWorkItem.Text +=  string.Format( "\r\n入队列时间{0} 启动时间{1} 完成时间{2}"
InBlock.gif                                        dtJoin.ToString(), dtStart.ToString(), dtEnd.ToString()); 
InBlock.gif                        }); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif 
InBlock.gif                 private  void txtRegisterWaitForSingleObject_MouseLeftButtonDown( object sender, MouseButtonEventArgs e) 
InBlock.gif                { 
InBlock.gif                        System.Threading.AutoResetEvent done =  new System.Threading.AutoResetEvent( false); 
InBlock.gif 
InBlock.gif                         // 为了传递 RegisteredWaitHandle 对象,要将其做一个封装 
InBlock.gif                        RegisteredWaitHandlePacket packet =  new RegisteredWaitHandlePacket(); 
InBlock.gif 
InBlock.gif                         // RegisterWaitForSingleObject - 注册一个 WaitHandle 。在超时或发信号的情况下对指定的回调方法做调用 
InBlock.gif                         // 第一个参数:需要注册的 WaitHandle 
InBlock.gif                         // 第二个参数:需要回调的方法(此处省略掉了委托类型) 
InBlock.gif                         // 第三个参数:传递给回调方法的参数 
InBlock.gif                         // 第四个参数:超时时间(到超时时间则调用指定的方法) 
InBlock.gif                         // 第五个参数:是否为一次调用(是到超时时间一次性调用指定的方法,还是每次超时时间后都调用指定的方法) 
InBlock.gif                        packet.Handle = System.Threading.ThreadPool.RegisterWaitForSingleObject 
InBlock.gif                                ( 
InBlock.gif                                        done, 
InBlock.gif                                        WaitOrTimer, 
InBlock.gif                                        packet, 
InBlock.gif                                        100, 
InBlock.gif                                         false 
InBlock.gif                                ); 
InBlock.gif 
InBlock.gif                        System.Threading.Thread.Sleep(555); 
InBlock.gif                        done.Set();  // 发出信号,调用 RegisterWaitForSingleObject 所指定的方法 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  void WaitOrTimer( object state,  bool timedOut) 
InBlock.gif                { 
InBlock.gif                        RegisteredWaitHandlePacket packet = state  as RegisteredWaitHandlePacket; 
InBlock.gif 
InBlock.gif                         // bool timedOut - 是否是因为超时而执行到这里 
InBlock.gif                         if (!timedOut)    
InBlock.gif                        { 
InBlock.gif                                 // 如果不是因为超时而执行到这里(即因为 AutoResetEvent 发出了信号而执行到这里),则注销指定的 RegisteredWaitHandle 
InBlock.gif                                packet.Handle.Unregister( null); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         this.Dispatcher.BeginInvoke(() => 
InBlock.gif                        { 
InBlock.gif                                txtRegisterWaitForSingleObject.Text += 
InBlock.gif                                        String.Format( "\r\n是否收到信号:{0}", (!timedOut).ToString()); 
InBlock.gif                        }); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         /// <summary> 
InBlock.gif         /// 封装了 RegisteredWaitHandle 的类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class RegisteredWaitHandlePacket 
InBlock.gif        { 
InBlock.gif                 public System.Threading.RegisteredWaitHandle Handle { get; set; } 
InBlock.gif        } 
InBlock.gif}
 
 




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


相关文章
|
2月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
34 0
|
1月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
45 7
|
16天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
1月前
|
SQL 机器学习/深度学习 算法
【python】python指南(一):线程Thread
【python】python指南(一):线程Thread
36 0
|
2月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
2月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
21 0
|
2月前
|
存储 算法 Java
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
26 0
|
25天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
49 1
|
7天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
25 15
一个Android App最少有几个线程?实现多线程的方式有哪些?