[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能
本节导读:
多线程(Multithreading)使我们程序可以同时进行多任务处理,直接提高了程序的执行效率,学习多线程对提高程序运行能力非常必要,本节主要介绍多线程原理及.NET中多线程的应用。
1. 关于多线程
在介绍多线程之前,先了解一下进程。
进程:独立运行的程序称为进程。(比如Windows系统后台程序,也可以称为后台进程)
线程:对于同一个程序分为多个执行流,称为线程。
多线程:使用多个线程进行多任务处理,称为多线程。
2. 如何合理使用多线程?
A.对于用户等待程序处理时,可以使用多线程处理耗时任务;
B.对于一些不需要即时完成的任务,可以使用后台任务线程处理;
C.对于多并发任务,可以使用多线程同时处理;
D.对于通讯类,比如对线程阻塞,可以使用多线程。
除过上面的几个常用的情况,还有很多情况下可以使用多线程。
3. 多线程的缺点
线程自然也有缺点,以下列出了一些:
A.如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;
B.更多的线程需要更多的内存空间;
C.线程会给程序带来更多的bug,因此要小心使用,比如:线程任务在执行完成后,要及时释放内存;
D.线程的中止需要考虑其对程序运行的影响。
4. .NET中的两种多线程
.NET本身就是一个多线程的的环境。
在.NET中有两种多线程的:
一种是使用Thread 类 进行线程的创建、启动,终止等操作。
一种是使用ThreadPool 类 用于管理线程池.
5. .NET中使用Thread 进行多线程处理
.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。
下面是该类几个至关重要的方法:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
6. 多线程示例
6.1 简单的线程
创建线程调用方法:
/// 线程方法
/// </summary>
static void MyThread()
{
int i = 0;
while(true){
Console.WriteLine("我是一个线程方法"+ (++i));
};
}
创建并启用线程:
ThreadStart threadStart = new ThreadStart(MyThread);
Thread thread = new Thread(threadStart);
thread.Start();
Thread.Sleep(5000);
thread.Abort();
运行结果如下:
6.2 多线程示例
下面还是使用比较熟悉的“武林高手”的例子,来实现两个高手各自独立的线程下战斗。
(说明:此实例主要是说明多线程的独立运行,重点并不是战斗过程。对于战斗过程,我们可以根据杀伤力让两个高手分别出招,可以想一下实现方法)
先定义“武林”类来实现武功和武林高手及战斗的方法
/// 武林
/// </summary>
public class MartialArts
{
/// <summary>
/// 大侠姓名
/// </summary>
private string name;
private List<MartialArtsMaster> masterList;
/// <summary>
/// 战斗
/// </summary>
/// <param name="name"></param>
public MartialArts(string _name,List<MartialArtsMaster> _list)
{
name = _name;
masterList = _list;
}
拥抱AngularJS - 雪羽轻扬 阅读原文»
文中一些地方AngularJS简称ng
简介:
ng诞生于2009年,由Misko Hevery等创建,后被Google收购,为克服HTML在构建应用上的不足而设计。
是一款优秀的前端JS框架,核心特性:MVVM(Model-View-ViewModel)、模块化、双向数据绑定、依赖注入。
入门:
书籍:
源码:
API:
介绍:
模块介绍:(v1.4.0)
- angular.js ng 核心
- angular-route.js ng 路由(参考地址)
- angular-animate.js ng 动画(参考地址)
- angular-cookies.js ng Cookie(参考地址)
- angular-sanitize.js ng 安全模块(应对XSS)
- angular-messages.js ng 表单验证(参考地址)
- angular-resource.js ng restful数据交互(然并卵,只是封装了一层$http,可以用来请求本地json文件)
- angular-mocks.js ng 单元测试工具类(参考地址)
- angular-loader.js ng 单元测试用(异常捕获,参考地址)
- angular-scenario.js ng 单元测试用
- angular-touch.js ng gestoures(针对移动端,基于jQuery Mobile的touch事件。不过貌似不太好用)
- angular-aria.js ng 富互联网应用(Accessible Rich Internet Applications,貌似没啥用)
- angular-meesage-format.js ng 编译相关(谨慎使用,该文件只有当闭合编译器的高级选项标识时才会编译)
控制器(controller):
简单理解为-通过依赖注入的方式,把service、依赖关系以及其他对象串联到一起,然后通过$scope把它们关联到view上。
app.controller('indexCtrl', ['$scope', 'demoService', function($scope, demoService) {
$scope.name = demoService.getName();
}])
路由控制:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/list', {
templateUrl: 'module/order/list.html',
controller: 'listCtrl'
})
.when('/detail/:orderid', {
templateUrl: 'module/order/detail.html',
controller: 'detailCtrl'
})
.otherwise({redirectTo: '/dashboard'});
}]);
指令(directive):
简单理解为-在特定DOM上运行的函数,指令可以扩展这个DOM的功能。
应用场景:封装通用插件
app.directive('tree', function($location) {
return {
restrict: 'EA',
replace: true,
scope: {
treeNodes: '='
},
templateUrl: './script/directive/template/treeTmpl.html',
link: function($scope, $element, $attrs) {
$scope.directTo = function(url) {
if(!!url) {
$location.path(url);
}
}
}
}
})
参考资料:
服务(service):
简单理解-单例对象
三种构建方式:
factory、service、provider
区分:
factory需要创建一个对象,并return这个对象。比较常用且容易理解。
没有评论:
发表评论