Javaスレッド - 私は順番に数を生成したい:1,2,3,4 ...など(2つのスレッドだけがあります)

Javaスレッド - 私は順番に番号を生成したい:1,2,3,4 ...(2つのスレッドのみ)1番目のスレッドo/pは1になり、2番目のスレッドo/pは2になります。スレッドo/pは3になりますので、最大10人まで増やすことができます。

以下は私の試みですが、それはうまく動作しません。私はwait()とnotify()メソッドがあることを知っていますが、それらを使う正しい方法を理解できません!

クラスNumberGenerator {     static int number = 0;

synchronized public int numGenerator()
{
    for(int i=0;i<20;i++)
    {
        System.out.println(i);
        number=i;
    }
    return number;
}

}

FirstThreadClassクラスはスレッドを拡張します {     NumberGenerator num;

FirstThreadClass(NumberGenerator num)
{
    this.num = num;
}

public void run()
{
    System.out.println("i am from 1st thread :"+num.numGenerator());

}

}

クラスSecondThreadClassはスレッドを拡張します {     NumberGenerator num;

SecondThreadClass(NumberGenerator num)
{
    this.num = num;
}

public void run()
{
    System.out.println("i am from 2nd thread :"+num.numGenerator());
}

}

パブリッククラスThreadTesting {     public static void main(String [] args){

    FirstThreadClass ftc = new FirstThreadClass(new NumberGenerator());
    SecondThreadClass stc = new SecondThreadClass(new NumberGenerator());
    ftc.start();
    stc.start();
}

}

0
すでに試したコードを投稿できますか?
追加された 著者 PDStat,
並行スレッドを持つことの要点は、独立したタスクが同時に実行できるようにすることです。この要件がある場合、タスクは互いに依存しているため、スレッドを使用しないように指示しています。
追加された 著者 Peter Lawrey,

5 答え

    class NumberGenerator
    {
        static int counter = 0;

        public synchronized int getNextNumber()
        {
            return counter++;
        }


    }
    class FirstThreadClass
        extends Thread
    {
        NumberGenerator num;

        FirstThreadClass(NumberGenerator num)
        {
            this.num = num;
        }

        public void run()
        {
            System.out.println("i am from 1st thread :" + num.getNextNumber());

        }


    }
    class SecondThreadClass
        extends Thread
    {
        NumberGenerator num;

        SecondThreadClass(NumberGenerator num)
        {
            this.num = num;
        }

        public void run()
        {
            System.out.println("i am from 2nd thread :" + num.getNextNumber());
        }


    }

    public class ThreadTesting
    {
        public static void main(String[] args)
        {
            FirstThreadClass ftc = new FirstThreadClass(new NumberGenerator());
            SecondThreadClass stc = new SecondThreadClass(new NumberGenerator());
            for (int k = 0; k < 10; k++)
            {
                ftc.run();
                stc.run();
            }
        }


    }
1
追加された
スレッドのrunメソッドを呼び出していて、起動していない場合は、手動でメソッドを呼び出すのと同じです。質問は2つのスレッドでシーケンスを印刷する
追加された 著者 coder,

彼らは毎回1つだけ生成する必要がありますか?それとも、thread1が2つの数字を生成したら、スレッド2が1つの数字などを生成するのですか?

カウンタとして動作するstatic intフィールドを使用し、同期した方法でアクセスします。

static int counter = 0;

public synchronized int getNextNumber(){
  return counter++;
} 

次に、スレッドは次のように行います。

while(...whatever..){
  System.out.print(getNextNumber());
}
0
追加された
うーん、私はあなたのロジックをその印刷o/pとして試してみました:私は第1スレッドからです:0私は第2スレッドからです:1
追加された 著者 Soumyaansh,
私は番号シーケンスを最大n個まで印刷したいが、その印刷のみ1,2どのようにwait()とnotify()を適用して、threadone print 1を実行してwait()状態にしてからthreadtwo print 2するとthreadoneに通知するそれ自体はwait()状態、threadone print 3 ...などになります。
追加された 著者 Soumyaansh,
はい、あなたが望むものではありませんか?
追加された 著者 kgautron,

各スレッドは次のように数値を生成できます。

Thread 1: 1, 3, 5, 7, 9, ...
Thread 2: 2, 4, 6, 8, 10, ...

並行コレクションに追加して後で並べ替えます。

0
追加された
これは私が答えることができなかったインタビューで尋ねられました...昨日から私は解決策を見つけようとしています:
追加された 著者 Soumyaansh,
@peter lawrey hi peterコメントありがとうございます私はあなたが言っていることを知っていますが、私はインタビュアーと議論することはできません:P彼は私にこれに頼んで私はとにかくそれに答える必要があった:(
追加された 著者 Soumyaansh,

これを実現するには、巡回バリアを使用してバリアを作成し、2つのスレッドが1つの番号を生成した後に2つの番号

class ThreadTest {

    private CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
        @Override
        public void run() {
            System.out.println(oddNumberGenerator.result);
            System.out.println(evenNumberGenerator.result);
        }
    });

    private NumberGenerator oddNumberGenerator = new NumberGenerator(1,11,2);
    private NumberGenerator evenNumberGenerator = new NumberGenerator(2,10,2);

    public void generateSeries(){
        oddNumberGenerator.generateNumbers();
        evenNumberGenerator.generateNumbers();
    }


    class NumberGenerator {
        private Thread thread;
        private int result;

        private NumberGenerator(final int initialValue, final int maxValue,
                                final int stepSize) {
            this.thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = initialValue; i <= maxValue; i = i + stepSize) {
                        try {
                            result = i;
                            cyclicBarrier.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (BrokenBarrierException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }

        public void generateNumbers() {
            thread.start();
        }
    }


    main(String[] args){
       new ThreadTest().generateSeries();
    }
}
0
追加された

あなたはwaitとnotifyAll()を使って達成することができます。しかし、それを達成するために標準のJava並行ク​​ラスを使用する方が常に良い

public class PrintAlternateValues {
    public static void main(String[] args) {

        final NumberValue number = new NumberValue();
        final Object lockObject = new Object();
        new Thread(){

            private NumberValue n  = number;
            @Override
            public void run() {
                synchronized (lockObject) {
                    while(n.getValue() < n.getEndPoint()){
                        while(n.isToggle()){
                            try{
                                lockObject.wait();
                            }catch(Exception e){
                                e.printStackTrace();
                            }
                        }

                        n.incrementValue();
                        System.out.println(getName() + " printing "+n.getValue());
                        n.setToggle(true);
                        lockObject.notifyAll();
                    }
                }
            }
        }.start();

        new Thread(){

            private NumberValue n  = number;
            @Override
            public void run() {
                synchronized (lockObject) {
                    while(n.getValue() < n.getEndPoint()){
                        while(!n.isToggle()){
                            try{
                                lockObject.wait();
                            }catch(Exception e){
                                e.printStackTrace();
                            }
                        }

                        n.incrementValue();
                        System.out.println(getName() + " printing "+n.getValue());
                        n.setToggle(false);
                        lockObject.notifyAll();
                    }
                }
            }
        }.start();
    }
}

class NumberValue {
    private int value;
    private boolean toggle = true;
    private int endPoint = 10;

    public int getEndPoint() {
        return endPoint;
    }

    public void setEndPoint(int endPoint) {
        this.endPoint = endPoint;
    }

    public boolean isToggle() {
        return toggle;
    }

    public void setToggle(boolean toggle) {
        this.toggle = toggle;
    }

    public  int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public synchronized void incrementValue(){
        this.value++; 
    }
}
0
追加された