两个线程,调用一方法,该方法有线程锁,若线程一进入这个线程锁内执行(时间较长),此时另一线程也在也在进入该方法内,但有线程锁,故线程二处于等待状态,当线程一执行完时,线程二会不会自动重新执行被上锁的代码块?????????
解决方案 »
- 初中数学问题
- 怎么动态更改DataGridView中的字段值?
- 怎样把datagridview中某一单元格的边框去掉,使用重绘或其它方法?
- 高分求助:C#的下载代码里如何控制线程的个数和每个用户的下载流量
- TcpClient 无法从传输连接中读取数据 问题
- WinFrom没有添加web服务引用
- CustomValidator问题:
- 如何在一个类的方法中引用另一个类中方法的对象数组呢
- 我有一个类,包含OleDbConnection和OleDbCommand两个成员对象,在析构函数里关闭连接,但是老是出现异常,怎么回事啊?
- C#关于Excel导出页面数据,方法已经有了,目前就是页面数据遇到问题了
- 新手提问 字符串给画了个红线
- 在C#中StringBuilder的作用?
这个是你提过的问题,你有没有尝试过回复中的修改啊.
private static object balanceLock = new object();
要写成静态的,这样两个或者多个类的实例,才可以锁住同一个对象.
DoAnything
....去锁当地一个线程进入后,执行DoAnything,这时第二个线程就在一边等候,当第一个完成后,并去锁,第二个进入开始执行DoAnything
{
public static void Main()
{
//BankAccount bk = new BankAccount();
ParameterizedThreadStart paraterThreadStart = new ParameterizedThreadStart(BankAccount.Deposit);
Thread thread = new Thread(paraterThreadStart);
thread.Start(10000); // BankAccount bk2 = new BankAccount();
ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(BankAccount.Deposit);
Thread thread2 = new Thread(paraterThreadStart2);
thread2.Start(1000);
Console.WriteLine("线程1状态{0};线程2状态{0}", thread.ThreadState, thread2.ThreadState);
Console.ReadLine();
//Thread.Sleep(1000);
Console.WriteLine("主线程输出");
Console.ReadLine();
}}
public class BankAccount
{
private int balance2;
public int Balance
{
set { balance2 = value; }
get { return balance2; }
}
private static object balanceLock = new object();
public static void Deposit(object delta)
{
Monitor.Enter(balanceLock);
try
{
int balance = 0;
string str = "0";
using (StreamReader sr = new StreamReader(@"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\text.txt", System.Text.Encoding.GetEncoding("GB2312")))
{
str = sr.ReadToEnd();
sr.Close();
}
/*Thread.Sleep(int.Parse(delta.ToString()));*/
for (int i = 0; i < (int)delta; i++)
{ int t = i; } balance = (int)delta + int.Parse(str);
using (StreamWriter sw = new StreamWriter(@"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\text.txt", false))
{
sw.Write(balance);
sw.Close();
} Console.WriteLine("{0}", balance);
Console.ReadLine();
}
finally
{
Monitor.Exit(balanceLock);
} }}
1、main 方法不变
2、调用类代码简化
public class BankAccount
{
private static object balanceLock = new object();
public static void Deposit(object delta)
{
int data = int.Parse(delta.ToString()); Monitor.Enter(balanceLock);
try
{
Console.WriteLine("curr thread : {0}",data.ToString()); Thread.Sleep(TimeSpan.FromMinutes(TimeSpan.FromSeconds(10)));
}
finally
{
Monitor.Exit(balanceLock);
}
}
}执行结果:线程1状态Running;线程2状态Running
主线程输出
curr thread : 1curr thread : 2
{
public static void Main()
{
//BankAccount bk = new BankAccount();
ParameterizedThreadStart paraterThreadStart = new ParameterizedThreadStart(BankAccount.Deposit);
Thread thread = new Thread(paraterThreadStart);
thread.Start(1000000); // BankAccount bk2 = new BankAccount();
ParameterizedThreadStart paraterThreadStart2 = new ParameterizedThreadStart(BankAccount.Deposit);
Thread thread2 = new Thread(paraterThreadStart2);
thread2.Start(1000);
Console.WriteLine("线程1状态{0};线程2状态{0}", thread.ThreadState, thread2.ThreadState);
Console.ReadLine(); }}