Многопоточность и качели - PullRequest
1 голос
/ 14 марта 2012

У меня проблема с параллельной работой двух потоков.Каждый из потоков работает нормально в индивидуальном порядке.Мое требование - отобразить 10 шаров, красный шар, если value равен 0, и зеленый шар, если value равен 1, один за другим.Данные в value получены из массива, содержащего 0 с или 1 с.Мне нужно запустить 16 таких потоков вместе.Я сейчас пытаюсь с двумя.

package pkg2;
public class mainClass {

public static void main(String[] args) {
    Intermediate frame = new Intermediate();
    }
}

Основной класс вызывает промежуточный класс

package pkg2;

import java.awt.Color;
import javax.swing.*;

public class Intermediate extends JFrame {

    public Intermediate() {
        DivScreen ob = new DivScreen();
        ob.setBackground(Color.black);
        ob.divScreen1(16);
        add(ob);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(1370, 740);
        setResizable(false);
    }
}

В промежуточном классе создается объект класса DivScreen, в котором выполняется вся работа с потоками и GUI.

package pkg2;

import java.awt.*;
import javax.swing.*;

public class DivScreen extends Canvas implements Runnable//,ActionListener
{

    Thread t1[];            //threads
    int i, j;               //n=total no. of lines, i=no. of rows, j=no of columns
    public static int x;    // x is now global variable
    public static int i1 = 0, i2 = 0;   //to continue fetching data from last entry
    public static int c1 = 0, c2 = 0;   // to check whether line is working or not
    public static int y1, y2;   // to show red or green balls
    public static int k1 = 0, k2 = 0;   //to draw 10 balls
    int green, blue, red;   //variables for color of lines
    int arr1[] = {1, 1, 0, 1};
    int arr2[] = {1, 0, 1, 0, 1, 0};

    public DivScreen() //default.  constructor
    {
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Font f = new Font("Arial", Font.BOLD, 30);
        setFont(f);
    }

    public void divScreen1(int m) {
        t1 = new Thread[2]; //HERE WE HAVE TO PAAS n AS SIZE OF THREAD ARRAY 
        // BUT JUST TO CHECK ITS WORKING WE ARE USING 2 THREADS 
        for (int i = 0; i < 2; i++) {
            t1[i] = new Thread(this, (i + 1) + "thread");
            t1[i].start();
        }
    }

    public void paint(Graphics g) {
        g.setColor(Color.white);

        for (int i = 1; i < 4; i++) {
            j = i;                              //j is for horizontal lines
            g.drawLine(i * 342, 0, i * 342, 740); //i is for vertical lines
            g.drawLine(0, j * 185, 1370, j * 185);
        }
        if (x == 1) {
            g.setColor(Color.GRAY);
            g.drawString("Line 1", 150, 50);
            if (c1 == 0) {
                g.drawString("Line is not in use", 30, 150);
                g.setColor(Color.black);
                g.fillRect(45, 90, 200, 30);
            } else {
                g.setColor(Color.black);
                g.fillRect(30, 120, 250, 30);
                if (k1 < 10) {
                    if (y1 == 0) {
                        g.setColor(Color.red);
                    } else {
                        g.setColor(Color.green);
                    }
                    g.fillOval(50 + 20 * (k1++), 100, 15, 15);
                } else {
                    k1 = 0;
                    g.setColor(Color.black);
                    g.fillRect(45, 90, 200, 30);
                }
            }
        }

        if (x == 2) {
            g.setColor(Color.gray);
            g.drawString("Line 2", 460, 50);
            if (c2 == 0) {
                g.drawString("Line is not in use", 370, 150);
                g.setColor(Color.black);
                g.fillRect(385, 90, 200, 30);
            } else {
                g.setColor(Color.black);
                g.fillRect(370, 120, 250, 30);
                if (k2 < 10) {
                    if (y2 == 0) {
                        g.setColor(Color.red);
                    } else {
                        g.setColor(Color.green);
                    }
                    g.fillOval(390 + 20 * (k2++), 100, 15, 15);
                } else {
                    k2 = 0;
                    g.setColor(Color.black);
                    g.fillRect(385, 90, 200, 30);
                }
            }
        }
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void run() {
        while (true) {
            if (Thread.currentThread().getName().equals("1thread")) {
                x = 1;
                int value = 0;              // to get value from array              
                while (i1 < 4) {
                    c1 = 1;
                    value = arr1[i1];   //valid is a value containing 1 or 0 
                    i1++;               // 1 implies product is OK, 0 implies product not OK

                    System.out.println(value);
                    if (value == 1) {
                        y1 = 1;         // we will check its value in paint() function
                    } else {
                        y1 = 0;
                    }
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            repaint(0, 0, 342, 185);
                        }
                    });


                    try {
                        Thread.sleep(200);
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                }

                c1 = 0;
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        repaint(0, 0, 342, 185);
                    }
                });


                try {
                    Thread.sleep(200);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }

            if (Thread.currentThread().getName().equals("2thread")) {
                x = 2;
                int value2 = 0;                 // to get value from arr2[]

                while (i2 < 6) {
                    c2 = 1;
                    value2 = arr2[i2];
                    i2++;
                    System.out.println(value2);
                    if (value2 == 1) {
                        y2 = 1;
                    } else {
                        y2 = 0;
                    }
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            repaint(342, 0, 342, 185);
                        }
                    });

                    try {
                        Thread.sleep(200);
                    } catch (Exception e) {
                        System.out.println(e);
                    }

                }

                c2 = 0;
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        repaint(342, 0, 342, 185);
                    }
                });

                try {
                    Thread.sleep(200);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }
}

Пожалуйста, ответьте, если сможете найти что-нибудь.Благодаря.

1 Ответ

1 голос
/ 14 марта 2012

Будьте осторожны с многопоточностью.

Просто пример:

  • x - это статическая переменная, которая будет изменена обоими потоками и также будет использоваться в paint (),Вы не можете ничего гарантировать для состояния x в начале или во время выполнения paint ().Потоки могут просто изменить его по своему усмотрению.

Я предлагаю вам прочитать немного больше о потоках и параллелизме и о том, как вы можете управлять этим, но я бы сказал, что самая большая проблема - это дизайн программы.сам.Чего именно вы пытаетесь достичь и зачем нужна многопоточность?Если вы хотите сделать обширные вычисления для того, что рисовать, хорошо иметь несколько потоков для этих вычислений, но метод рисования должен получать эту информацию одновременно безопасным способом.Только одна нить должна выполнять работу по рисованию, а информация, используемая во время рисования, должна быть заблокирована.

...