Печать алфавитов и чисел с использованием многопоточности - PullRequest
0 голосов
/ 23 октября 2018

Я только начал изучать темы и довольно плохо знаком с ними. Я пытаюсь печатать алфавиты и цифры один за другим. Я синхронизировал их, используя флаг, но безрезультатно.

открытый класс Алфавиты{

public static void main(String[] args) {

          AN an= new AN(false);

          Thread t1=new Thread(new Runnable() {

            @Override
            public void run() {

                try {

                    an.Alpha();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });


          Thread t2= new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    an.numbers();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });


          t1.start();
          t2.start();
}

}

класс AN {

boolean flag;

AN(boolean flag)
{
    this.flag=flag;
}
synchronized void Alpha() throws InterruptedException
{
    if(flag==false)
    {
    for(char i='A'; i<='Z';i++)
    {
        System.out.println(+i);
        notifyAll();
        flag=true;
    }
    }
    else
    {
        wait();
    }

}

synchronized void numbers() throws InterruptedException
{
    if(flag==true)
    {
    for(int i=1;i<=26;i++)
    {
        System.out.println(+i);
        notifyAll();
        flag=false;
    }
    }
    else
    {
        wait();
    }
}

}

Мой желаемый результат: a1b2c3d4 ....

Вывод моей консоли: abcd ... 1234 ...

Кто-нибудь может указать на ошибку, поскольку я не могу синхронизировать эти два потока.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Что ж, вы хотите более или менее конвейерную работу, поэтому потоки должны знать, когда им разрешено работать.

Поэтому я бы использовал Очередь для ожидания ввода в одном потоке и ожидания его установки в другом потоке.

Класс AN:

import java.util.concurrent.BlockingQueue;

class AN
{

    BlockingQueue<Boolean> input;

    BlockingQueue<Boolean> output;

    AN(BlockingQueue<Boolean> input, BlockingQueue<Boolean> output)
    {

        this.input = input;
        this.output = output;
    }

    void Alpha() throws InterruptedException
    {
        for (char i = 'a'; i <= 'z'; i++) {
            input.take();
            System.out.print(i);
            output.put(Boolean.TRUE);

        }
    }

    void numbers() throws InterruptedException
    {
        for (int i = 1; i <= 26; i++) {
            input.take();
            System.out.print(i);
            output.put(Boolean.TRUE);
        }

    }

}

Класс теста (или где ваш главный):

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Test
{

    public static void main(String[] args) throws InterruptedException
    {

        BlockingQueue<Boolean> input = new LinkedBlockingQueue<>();
        BlockingQueue<Boolean> output = new LinkedBlockingQueue<>();

        AN an1 = new AN(output, input);
        AN an2 = new AN(input, output);
        output.add(Boolean.TRUE);

        Thread t1 = new Thread(new Runnable()
        {

            @Override
            public void run()
            {
                try {
                    an1.Alpha();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(new Runnable()
        {

            @Override
            public void run()
            {
                try {
                    an2.numbers();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

        t1.start();
        t2.start();

    }
}

Выходы: a1b2c3d4e5f6g7h8i9j10k11l12m13n14o15p16q17r18s19t20u21v22w23x24y25z26

0 голосов
/ 01 мая 2019

Вы можете достичь этого, используя BlockingQueue и Object в методах wait и notify.

public class AlphaNum {
    public static void main(String[] args) throws InterruptedException {


    BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);

    AtomicBoolean flag = new AtomicBoolean(Boolean.TRUE);

    Object lock = new Object();

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {

            try {
                for(int i=1;i<=26;i++){
                        synchronized (lock){
                            while (flag.get()){
                                lock.wait();
                            }
                            System.out.print(i);
                            flag.set(Boolean.TRUE);
                            lock.notify();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    });

    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                for(char c='A';c<='Z';c++){
                    synchronized (lock){
                        while (!flag.get()){
                            lock.wait();
                        }
                        System.out.print(c);
                        flag.set(Boolean.FALSE);
                        lock.notify();
                    }
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    });


    t1.start();
    t2.start();

    }
}

Приведенный выше код печатает a1b2c3d4 ....... z26

0 голосов
/ 23 октября 2018

Измените класс AN, чтобы проверить флаг в цикле while.

public class AN {
  boolean flag;

  AN(boolean flag) {
    this.flag = flag;
  }

  synchronized void Alpha() throws InterruptedException {

    for(char i = 'A'; i <= 'Z'; i++) {
      while(flag == true) {
        wait();
      }
      System.out.println(i);
      notifyAll();
      flag = true;
    }
  }

  synchronized void numbers() throws InterruptedException {

    for(int i = 1; i <= 26; i++) {
      while(flag == false) {
        wait();
      }
      System.out.println(i);
      notifyAll();
      flag = false;
    }
  }
...