这程序我照书上打的,书上说这程序输出结果应该是2个线程的结果交替的显示出来,可为什么我这显示的结果总是先是main线程的结果,然后才是worker线程的结果?using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace _CSharp_Console
{ class Program
{
static void ShowNumbers()
{
Thread thisThread = Thread.CurrentThread;
Console.WriteLine("Starting Thread: " + thisThread.Name);
int n = 10000000;
for (int i = 1; i < 8 * n; i++)
{
if (i % n == 0)
Console.WriteLine(thisThread.Name + ":count has reached " + i);
}
} static void Main(string[] args)
{
Thread thisThread = Thread.CurrentThread;
thisThread.Name = "Main"; Thread worker = new Thread(delegate()
{
ShowNumbers();
Console.WriteLine("Worker Thread Finished");
});
worker.Name = "Worker"; ShowNumbers(); //主线程调用ShowNumbers函数
worker.Start(); //worker线程调用ShowNumbers函数
Console.WriteLine("Main Thread Finished");
Console.ReadLine();
} }
}
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace _CSharp_Console
{ class Program
{
static void ShowNumbers()
{
Thread thisThread = Thread.CurrentThread;
Console.WriteLine("Starting Thread: " + thisThread.Name);
int n = 10000000;
for (int i = 1; i < 8 * n; i++)
{
if (i % n == 0)
Console.WriteLine(thisThread.Name + ":count has reached " + i);
}
} static void Main(string[] args)
{
Thread thisThread = Thread.CurrentThread;
thisThread.Name = "Main"; Thread worker = new Thread(delegate()
{
ShowNumbers();
Console.WriteLine("Worker Thread Finished");
});
worker.Name = "Worker"; ShowNumbers(); //主线程调用ShowNumbers函数
worker.Start(); //worker线程调用ShowNumbers函数
Console.WriteLine("Main Thread Finished");
Console.ReadLine();
} }
}
解决方案 »
- winform程序里,如何给datagridview设置linklable列??
- 跪求 在WorldWind中如何让3D模型随鼠标移动 例子
- 紧急!求救,程序不能运行
- 一个关于HttpWebRequest处理Cookie的问题
- Winform中的DataGrid问题?
- 一些程序的保存自动密码怎么做呀!!
- 大家讨论下!
- 关于水晶报表9。02 和 .net自带的水晶报表的问题。!有兴趣的请进!很着急啊。
- win form中imagelist资源问题?
- System.ArgumentOutOfRangeException:“索引和长度必须引用该字符串内的位置。 Arg_ParamName_Name”
- 在Visnal C# Express中怎么显示行号?
- 如何獲取動態產生控件的值!
worker.Start(); //worker线程调用ShowNumbers函数等待ShowNumbers()执行完后才会启动work线成2个位置互换一下。
using System.Threading; public class DoSomethingThread
{
static void WorkerMethod()
{
for(int i = 1; i < 1000; i++)
{
Console.WriteLine("Worker Thread: " + i.ToString());
}
} static void Main()
{
ThreadStart ts = new ThreadStart(WorkerMethod);
Thread t = new Thread(ts);
t.Start();
for(int i = 1; i < 1000; i++)
{
Console.WriteLine("Primary Thread: " + i.ToString());
} Console.ReadLine();
}
}
Primary Thread: 1
Primary Thread: 2
Primary Thread: 3
...
Worker Thread: 743
Worker Thread: 744
Worker Thread: 745
...
Primary Thread: 1000
worker.Start(); //worker线程调用ShowNumbers函数->>>>>改成: worker.Start(); //worker线程调用ShowNumbers函数
ShowNumbers(); //主线程调用ShowNumbers函数
即先启动子线程..
ShowNumbers(); //主线程调用ShowNumbers函数
worker.Start(); //worker线程调用ShowNumbers函数由于你调用ShowNumbers后,主线程会阻塞在这个方法,直到方法返回,才会继续往下执行,即这个方法调用结束后才会执行下面的启动子线程的操作,然后子线程才会运行,就不会表现出交替调用的现象...
ShowNumbers(); //主线程调用ShowNumbers函数即先启动子线程,然后调用主线程的方法,这时你一启动子线程(worker.Start();),继续执行下面的代码(ShowNumbers(); ),而不会阻塞,这时就会有两个线程同时在运行(主线程了子线程),所以就会表现出交替出现的现象....
Starting Thread: Worker
Main:count has reached 10000000
Worker:count has reached 10000000
Main:count has reached 20000000
Worker:count has reached 20000000
Main:count has reached 30000000
Worker:count has reached 30000000
Main:count has reached 40000000
Worker:count has reached 40000000
Main:count has reached 50000000
Worker:count has reached 50000000
Main:count has reached 60000000
Worker:count has reached 60000000
Main:count has reached 70000000
Worker:count has reached 70000000
Main Thread Finished
Worker Thread Finished