国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

多線程計數,怎么保持計數準確的方法

2019-11-26 15:47:42
字體:
來源:轉載
供稿:網友

首先使用設計模式中的單件模式,防止多次初始化對象,造成訪問空間的不一致。

計數處要加lock,將其他線程計數暫時阻塞,保證計數的正確性。

如果要想實時計數實時輸出,可以將計數和輸出處一并lock處理,不然不同線程的計數和輸出結果未必按順序處理,

如此加鎖能保證按順序處理按順序輸出,不過這樣多少都 損失了一些性能

代碼中加鎖位置很重要

此程序會增加三次運算,原因是本線程未到200次,但是必然會有一個線程第一次增加所以在add里再做判斷

復制代碼 代碼如下:

CommonSigleton MyCounter =CommonSigleton.Instance;
  /// <summary>
  /// 線程工作
  /// </summary>
public void DoSomeWork()
{
    ///構造顯示字符串
    string results = "";

    ///創建一個Sigleton實例

    System.Threading.Thread.Sleep(100);

    int i = 0;
    while (MyCounter.GetCounter() < 200)
    {
        //保證計數與輸出一致,即便計數與輸出之間加上時間間隔也會為這塊區域加鎖,防止其他線程操作
        lock (this)
        {
            ///開始計數
            MyCounter.Add();
            System.Threading.Thread.Sleep(100);
            Thread thread = Thread.CurrentThread;
            results += "線程";
            results += i++.ToString() + "――〉" + thread.Name + " ";
            results += "當前的計數:";
            results += MyCounter.GetCounter().ToString();
            results += "/n";

            Console.WriteLine(results);

            // 清空顯示字符串
            results = "";
        }
    }
}

  public void StartMain()
  {

   Thread thread0 = Thread.CurrentThread;

   thread0.Name = "Thread 0";

   Thread thread1 =new Thread(new ThreadStart(DoSomeWork));

   thread1.Name = "Thread 1";

   Thread thread2 =new Thread(new ThreadStart(DoSomeWork));

   thread2.Name = "Thread 2";

   Thread thread3 =new Thread(new ThreadStart(DoSomeWork));

   thread3.Name = "Thread 3";

            thread1.Start();

            thread2.Start();

            thread3.Start();

   ///線程0也只執行和其他線程相同的工作
   DoSomeWork();
  }
 }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 四川省| 罗定市| 泌阳县| 昭觉县| 兴仁县| 赣州市| 乐陵市| 南江县| 阜阳市| 婺源县| 四会市| 大安市| 阿尔山市| 长岭县| 崇文区| 类乌齐县| 始兴县| 长汀县| 永德县| 旬邑县| 婺源县| 冕宁县| 台东市| 桑植县| 民勤县| 信丰县| 无锡市| 九龙县| 安西县| 延边| 台南县| 襄樊市| 闵行区| 吉林市| 灵寿县| 颍上县| 德化县| 始兴县| 芒康县| 吴堡县| 黄龙县|