java – 你如何思考和预测这样的线程问题的输出?

前端之家收集整理的这篇文章主要介绍了java – 你如何思考和预测这样的线程问题的输出?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在准备SCJP,多线程一直是我最肮脏的区域,主要是因为我不知道如何看多线程代码,并通过它.到目前为止,我的方法是用英文写下每个线程可能发生的情况,并测试一些线程随机相交的情况,这是一个真正的命中和遗漏和耗时的方法.所以我想看看一个专业人士会如何去做.您是否愿意阅读下面的代码(这是最新的问题,让我很麻烦),并记下你的头脑(只有与代码相关的东西,请:),你制定出可能的输出?问题的选择到底是什么.我正在寻找的不是我的解决方案,而是在考试中有效地到达解决方案.

是的,我知道这个问题没有一个确切的答案,等等.接受的投票是最清楚和最容易效仿的答案,好的:)

感谢大家!

问题:哪些答案是可能的输出

public class Threads1 {

    int x = 0;

    class Runner implements Runnable {

        public void run() {
            int current = 0;
            for (int i = 0; i < 4; i++) {
                current = x;
                System.out.print(current + ",");
                x = current + 2;
            }
        }
    }

    public static void main(String[] args) {
        new Threads1().go();
    }

    public void go() {
        Runnable r1 = new Runner();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}

选择(选择所有适用):

A. 0,2,4,6,8,10,

B. 0,

C.0,12,14,

D.0,

E.0,

解决方法

A和C(假设问题是哪些答案是可能的输出?)

当然,当您找到可能的解决方案时,困难的部分不是.但是,它要看看你认为是不可能的,并试图说服自己,你有一个坚实的理由,为什么不可能,你已经消除了所有的方法来摆脱你的理由.

So far my approach has been to write down in English what might be happening in each thread …

你需要弄清楚每个号码打印哪个线程.以下是我可以想到的最有效率,简洁的格式,并且使您可以在完成可能性时轻松交叉/擦除/写入.实现:

>一旦找到可能的答案就行了.如果不可能在现实世界中或者可能存在其他可能的(或不可能的)组合,这并不重要.只要你发现一个可能性,那就是你需要继续前进的一切.
>首先尝试最简单的方法,例如假设T1为每个数字,直到你打到不能T1的数字,所以你填写T2,等等..希望你到最后没有矛盾(或矛盾很容易解决).找到可能的组合后,继续.
>随意跳过去,尽快消除可能的,所以你可以专注于可能不可能的事情.

这是我的划痕纸/工作表的最终编辑(附加了我的精神注释):

A. 0,1  1  1  2  2  2   2  1     <- possible threads that produced this output - possible solution

B. 0,1  2  2  2  2   ?  1        <- to print second '2',T1 interrupted between L10/L11; 4 passes of T2 used up

C. 0,1  1  1  1  2   2   2   2   <- possible solution - simplest solution (T2 waits until T1 is completely done) - doesn't matter that it isn't likely,just that is possible

D. 0,1  2  1  2  1  2  1  2  1  2   ?    <- threads used up

E. 0,1  1  1  1  2   2   2   2  ?   <- threads used up

注意:

http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html

  • Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).

Atomic actions cannot be interleaved,so they can be used without fear of thread interference.

猜你在找的Java相关文章