Member 14030709 Ответов: 2

Я не знаю, как díplay < string + addelement(x) > В jlist


Thtread A создает случайное число и добавляет его в текстовую область A, а затем уведомляет поток B. Затем поток B добавляет Это число в текстовую область B и уведомляет поток A о создании нового случайного числа... и продолжает в том же духе.

Пример:

Нить А Нить Б
A создать 51 B отобразить 51
A создать 43 B отобразить 43
Создать 29

Моя проблема: моя программа успешно работала с числами, но я не знаю, как отобразить "A create + number" и "B display + number", например.

Что я уже пробовал:

DefaultListModel ta,tb;
    Thread a, b; Random u;
    public JFrame1() {
        initComponents();
        ta = new DefaultListModel();
        text1.setModel(ta);
        tb = new DefaultListModel();
        text2.setModel(tb);
        u = new Random();
        initThreadA();
        initThreadB();
    }
    
void threadA_work() {
    String []ar = {"A create %d"};
       int x = u.nextInt(100);
       //ta.addElement("A create ");
       ta.addElement(x);
    }
    void threadB_work() {
        int size = ta.getSize();
        int x = (Integer) ta.elementAt(size - 1);
        //tb.addElement("B display ");
        tb.addElement(x);
    }

    void initThreadA() {
        a = new Thread() {
            public void run() {
                while(true) {
                    threadA_work();
                    try {
                        sleep(1000);
                    } catch(InterruptedException e) { } 
                    synchronized(b) {
                        b.notify();
                    }
                    try {
                        synchronized(this) {
                            wait();
                        } 
                    } catch(InterruptedException e) { }
                }    
            }  
        };  
    }

    void initThreadB() {
        b = new Thread() {
            public void run() {
                while(true) {
                    try {
                        synchronized(this) {
                            wait();
                        } 
                    } catch(InterruptedException e) { }
                    threadB_work();
                    try {
                        
                        sleep(1000);
                    } catch(InterruptedException e) {  }
                    synchronized(a) {
                        a.notify(); 
                    }
                }    
           }  
        };  
    }
    private void bt1ActionPerformed(java.awt.event.ActionEvent evt) {                                    
        a.start();
        b.start();  
    }   

2 Ответов

Рейтинг:
2

Richard MacCutchan

String []ar = {"A create %d"};
   int x = u.nextInt(100);
   //ta.addElement("A create ");
   ta.addElement(x);

В этом нет особого смысла. Почему вы пытаетесь создать массив строк всего с одной строкой текста? А элемент "%d" обычно используется в строке формата, которая должна быть заменена числовым значением. Я подозреваю, что вы на самом деле хотите что-то вроде:
String strText = String.format("A create %d", nextInt(100));
   ta.addElement(strText);


Рейтинг:
1

Member 14030709

Я уже пробовал ситуацию вашего решения, но поток а бежал, а поток б не работал. Поток B не может получить значение из потока A


Richard MacCutchan

Пожалуйста, не оставляйте комментарии или вопросы в качестве решений.

Я только дал вам код, чтобы правильно установить текстовую строку. То что вы пытаетесь сделать это поток B это преобразовать строку "A create N" до целого числа. Но это текст, а не число, поэтому он всегда будет терпеть неудачу. Вам нужно изменить его так, чтобы он просто содержал числовые цифры, без преамбулы "A create " Я не уверен, что вы на самом деле пытаетесь сделать со всем этим кодом, но он кажется гораздо более сложным, чем должен быть. Почему вы используете нити в первую очередь?