亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java線程問題,如何修改代碼,讓程序能夠正常輸出如下結果?

java線程問題,如何修改代碼,讓程序能夠正常輸出如下結果?

慕田峪9158850 2019-02-21 01:03:20
package com.elyong.whatsup; /** * Created by ely ong on 2017/12/5. */ public class TestThreads{ public static void main(String[] args){ ThreadOne t1=new ThreadOne(); ThreadTwo t2=new ThreadTwo(); Thread one=new Thread(t1); Thread two=new Thread(t2); one.start(); two.start(); } } class Accum{ private static Accum a=new Accum(); private int counter=0; private Accum(){} public static Accum getAccum(){ return a; } public void updateCounter(int add){ counter+=add; } public int getCount(){ return counter; } } class ThreadOne implements Runnable{ Accum a=Accum.getAccum(); public void run(){ for(int x=0;x<98;x++){ a.updateCounter(1000); try{ Thread.sleep(50); }catch (InterruptedException ex){} } System.out.println("one "+a.getCount()); } } class ThreadTwo implements Runnable{ Accum a=Accum.getAccum(); public void run(){ for(int x=0;x<99;x++){ a.updateCounter(1); try{ Thread.sleep(50); }catch (InterruptedException ex){} } System.out.println("two "+a.getCount()); } } 輸出結果: one 98098 two 98099
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

package com.elyong.whatsup;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by ely ong on 2017/12/5.
 */
public class TestThreads {
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(2);
        ThreadOne t1 = new ThreadOne(barrier);
        ThreadTwo t2 = new ThreadTwo(barrier);
        Thread one = new Thread(t1);
        Thread two = new Thread(t2);
        one.start();
        two.start();
    }
}

class Accum {
    private static Accum a = new Accum();
    //private int counter = 0;

    private AtomicInteger counter;

    private Accum() {
        counter = new AtomicInteger(0);

    }

    public static Accum getAccum() {
        return a;
    }

    public void updateCounter(int add) {
        //counter += add;
        counter.addAndGet(add);
    }

    public int getCount() {
        //return counter;
        return counter.get();
    }
}

class ThreadOne implements Runnable {
    Accum a = Accum.getAccum();

    CyclicBarrier barrier;

    public ThreadOne(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    public void run() {
        for (int x = 0; x < 98; x++) {
            a.updateCounter(1000);
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
        }
        try {
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println("one " + a.getCount());
    }
}

class ThreadTwo implements Runnable {
    Accum a = Accum.getAccum();

    CyclicBarrier barrier;

    public ThreadTwo(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    public void run() {
        for (int x = 0; x < 99; x++) {
            a.updateCounter(1);
            if(x == 97) {
                try {
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
        }
        System.out.println("two "+a.getCount());

    }
}
查看完整回答
反對 回復 2019-03-01
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

參考樓上,給出我的兩種實現??雌饋頉]那么高大上,但是好理解一些。
實現1:

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by ely ong on 2017/12/5.
 */
public class TestThreads {
    public static void main(String[] args) {
        ThreadOne t1 = new ThreadOne();
        ThreadTwo t2 = new ThreadTwo();
        Thread one = new Thread(t1);
        Thread two = new Thread(t2);
        one.start();
        two.start();
    }
}

class Accum {
    private static Accum a = new Accum();
    //private int counter = 0;
    private AtomicInteger counter;
    
    private Accum() {
        counter = new AtomicInteger(0);
    }

    public static Accum getAccum() {
        return a;
    }

    public void updateCounter(int add) {
        //counter += add;
        counter.addAndGet(add);
    }

    public int getCount() {
        //return counter;
        return counter.get();
    }
}

class ThreadOne implements Runnable {
    Accum a = Accum.getAccum();

    public void run() {
        for (int x = 0; x < 98; x++) {
            a.updateCounter(1000);
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
        }
        System.out.println("one " + a.getCount());
    }
}

class ThreadTwo implements Runnable {
    Accum a = Accum.getAccum();

    public void run() {
        for (int x = 0; x < 99; x++) {
            a.updateCounter(1);
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
            if (x == 97) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                }
            }
        }
        System.out.println("two " + a.getCount());
    }
}

實現二:

/**
 * Created by ely ong on 2017/12/5.
 */
public class TestThreads {
    public static void main(String[] args) {
        ThreadOne t1 = new ThreadOne();
        ThreadTwo t2 = new ThreadTwo();
        Thread one = new Thread(t1);
        Thread two = new Thread(t2);
        one.start();
        two.start();
    }
}

class Accum {
    private static Accum a = new Accum();
    private int counter = 0;

    private Accum() {
    }

    public static Accum getAccum() {
        return a;
    }

    public synchronized void updateCounter(int add) {
        counter += add;
    }

    public int getCount() {
        return counter;
    }
}

class ThreadOne implements Runnable {
    Accum a = Accum.getAccum();

    public void run() {
        for (int x = 0; x < 98; x++) {
            a.updateCounter(1000);
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
        }
        System.out.println("one " + a.getCount());
    }
}

class ThreadTwo implements Runnable {
    Accum a = Accum.getAccum();

    public void run() {
        for (int x = 0; x < 99; x++) {
            a.updateCounter(1);
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
            }
            if (x == 97) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                }
            }
        }
        System.out.println("two " + a.getCount());
    }
}
查看完整回答
反對 回復 2019-03-01
?
森欄

TA貢獻1810條經驗 獲得超5個贊

利用并發輔助類試一試。

查看完整回答
反對 回復 2019-03-01
  • 3 回答
  • 0 關注
  • 467 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號