数学之路-vb.net并行计算(6)
2015-03-30 15:43
375 查看
Imports System
Imports System.Threading
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
mythread1.Name = "thread_1"
mythread2.Name = "thread_2"
mythread3.Name = "thread_3"
'设置优先级
mythread1.Priority = ThreadPriority.Lowest
mythread2.Priority = ThreadPriority.Highest
mythread3.Priority = ThreadPriority.Normal
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
'执行线程
mythread1.Start()
mythread2.Start()
mythread3.Start()
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
End Sub
Public Sub mythreadrun()
Dim mynum As Integer
'分配一个新的槽,这个槽存放线程本地数据,槽名称为
'myjg,名称必须唯一
Dim jg As LocalDataStoreSlot
jg = Thread.GetNamedDataSlot("myjg")
Thread.SetData(jg, 100)
Try
For mynum = 1 To 30
Thread.SetData(jg, Thread.GetData(jg) - mynum)
Console.WriteLine(Thread.CurrentThread.Name & "==>" & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",计算结果为:" & Thread.GetData(jg))
Thread.Sleep(50)
Next
Catch
Console.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
Finally
Console.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "线程运行完毕!")
Console.WriteLine(Thread.CurrentThread.Name & " " & Thread.CurrentThread.Priority.ToString)
Thread.FreeNamedDataSlot("myjg")
End Try
End Sub
End Module
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
线程优先级的设置方法有以下几种1)如上面代码所示设置优先级
mythread1.Priority = ThreadPriority.Lowest
mythread2.Priority = ThreadPriority.Highest
mythread3.Priority = ThreadPriority.Normal
这种方式 使CLR做一些额外的簿记工作,以便当线程返回线程池时优先级比Normal更高时,通过这些簿记信息来恢复优先级。
ThreadPriority枚举值有以下几种 Lowest 可以将 Thread 安排在具有任何其他优先级的线程之后。
BelowNormal 可以将 Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。
Normal 可以将 Thread 安排在具有 AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前。 默认情况下,线程具有 Normal 优先级。
AboveNormal 可以将 Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。
Highest 可以将 Thread 安排在具有任何其他优先级的线程之前。 ThreadPriority 定义一组线程优先级的所有可能值。 线程优先级指定一个线程相对于另一个线程的相对优先级。每个线程都有一个分配的优先级。 在运行时内创建的线程最初被分配 Normal 优先级,而在运行时外创建的线程在进入运行时时将保留其先前的优先级。 可以通过访问线程的 Priority 属性来获取和设置其优先级。根据线程的优先级调度线程的执行。 用于确定线程执行顺序的调度算法随操作系统的不同而不同。 操作系统也可以在用户界面的焦点在前台和后台之间移动时动态地调整线程的优先级。
2)通过System.Diagnostics.ProcessThread来设置优先级,它能设置比第1种方法更多的优先级Idle 指定空闲优先级。 它是所有线程的可能的最低优先级值,与关联的 ProcessPriorityClass 的值无关。
Lowest 指定最低优先级。 这比关联的 ProcessPriorityClass 的普通优先级低两级。
BelowNormal 指定的优先级比关联的 ProcessPriorityClass 的普通优先级低一级。
Normal 指定关联的 ProcessPriorityClass 的普通优先级。
AboveNormal 指定的优先级比关联的 ProcessPriorityClass 的普通优先级高一级。
Highest 指定最高优先级。 这比关联的 ProcessPriorityClass 的普通优先级高两级。
TimeCritical 指定时间关键优先级。 这是所有线程中的最高优先级,与关联的 ProcessPriorityClass 的值无关 Dim myprocess As Process = Process.GetCurrentProcess()
Dim value As ProcessThreadCollection
Dim pt As ProcessThread
value = myprocess.Threads
For Each pt In value
pt.PriorityLevel = ThreadPriorityLevel.AboveNormal
Next
此外,还可以设置线程动态优先级调整的开关ProcessThread.PriorityBoostEnabled 当 PriorityBoostEnabled 为 true 时,只要关联的进程离开等待状态,系统便暂时提升该线程的优先级。 此操作可防止其他进程中断当前线程的处理。 PriorityBoostEnabled 设置影响所有现有线程及该进程随后创建的所有线程。 若要还原正常行为,请将 PriorityBoostEnabled 属性设置为 false。仅当线程运行在一个将 PriorityClass 设置为动态优先级枚举值之一(Normal、High 或 RealTime)时,PriorityBoostEnabled 才有效。 4、睡眠与阻塞Sleep(Int32)将当前线程挂起指定的时间。注意参数为线程被阻塞的毫秒数
Imports System.Threading
Class Example
Shared Sub Main()
For i As Integer = 0 To 4
Console.WriteLine("Sleep for 2 seconds.")
Thread.Sleep(2000)
Next
Console.WriteLine("Main thread exits.")
End Sub
End Class
Sleep(TimeSpan)将当前线程阻塞指定的时间。 下面是关于msdn的阻塞的例子
Imports System.Threading
Class Example
Shared Sub Main()
Dim interval As New TimeSpan(0, 0, 2)
For i As Integer = 0 To 4
Console.WriteLine("Sleep for 2 seconds.")
Thread.Sleep(interval)
Next
Console.WriteLine("Main thread exits.")
End Sub
End Class
mythread1.Start(myprocess)
mythread2.Start(myprocess)
mythread3.Start(myprocess)
mythread1.Suspend()
mythread2.Suspend()
mythread3.Suspend()
mythread1.Resume()
mythread2.Resume()
mythread3.Resume()
相关文章推荐
- 数学之路-vb.net并行计算(2)
- 数学之路-vb.net并行计算(5)
- 数学之路-vb.net并行计算(1)
- 数学之路-vb.net并行计算(4)
- 数学之路-vb.net并行计算(3)
- 数学之路-python计算实战(24)-并行计算(2)
- 数学之路-python计算实战(23)-并行计算(1)
- 数学之路-仿生计算-分子生物学基础(1)-细胞合成的分子
- 用 VB.NET 实现的非确定性计算例子
- C#数学计算包 Math.NET
- VB.net 调用matlab引擎计算
- 在VB.NET中利用Split和Replace函数计算字数
- VB.NET函数——数学函数/字母串函数
- VB.Net常用数学函数整理
- VB.net | 如何在程序中执行用户脚本以及进行代数式计算
- 数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
- vb.net 补码计算
- VB.NET中如何利用Split和Replace函数计算字数
- C#数学计算包 Math.NET[转]
- VB.Net常用数学函数整理