Java 将JList线程与其他类中的线程同步

Java 将JList线程与其他类中的线程同步,java,multithreading,swing,locking,jlist,Java,Multithreading,Swing,Locking,Jlist,我在一个类中有一个JList,它正在排队和退队。还有一个类,从列表中获取并显示一个随机项。如何确保离开列表的项目是显示的项目?不尝试实现FIFO。我是个新手。提前谢谢 使用列表初始化:- import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.JList; /** *

我在一个类中有一个JList,它正在排队和退队。还有一个类,从列表中获取并显示一个随机项。如何确保离开列表的项目是显示的项目?不尝试实现FIFO。我是个新手。提前谢谢

使用列表初始化:-

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JList;

/**
 *
 * @author skb
 */
public class Queue extends Thread{
    int size,capacity;
    PriorityQueue<Customer> queue;
    JList display;
    Thread t;
    DefaultListModel dlm;
    
    public Queue(int capacity,JList qi){
        this.queue = new PriorityQueue<Customer>();
        this.capacity=capacity;
        this.size=0;
        this.display=qi;
        this.dlm=new DefaultListModel();
    }
    public boolean queue (Customer cus){
        if(size<capacity){
            queue.add(cus);
            size++;
            dlm.addElement(cus.toString());
            display.setModel(dlm);
            return true;
        }else{
            return false;
        }
    }
    public boolean isEmpty(){
        return queue.isEmpty();
    }
    public Customer dequeue(){
        if(!dlm.isEmpty()){
            dlm.remove(0);
            display.setModel(dlm);
            return this.queue.remove();
        }else{
            return null;
        }
        
    }
    private ArrayList loadData(){
        ArrayList<Customer> data=new ArrayList<>();
        Loader loader=new Loader();
        String[] customers=loader.readFile("customers.txt");
        for(int i=0;i<customers.length;i++){
            String[] temp=customers[i].split(":");
            data.add(new Customer(temp[0],temp[1],temp[2]));
        }
        return data;
    }
    
    @Override
    public void run(){
        ArrayList<Customer> data=loadData();
        for (int i=0;i<data.size();i++){
            queue(data.get(i));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Queue.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    @Override
    public void  start(){
        if(t==null){
            t=new Thread(this,"customers queue");
            t.start();
        }
    }
    
}

若要更快获得更好的帮助,请添加or。若要更快获得更好的帮助,请添加or。
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextArea;

/**
 *
 * @author skb
 */
public class Desk extends Thread{
    private String desk;
    private JTextArea display;
    Thread t;
    public Desk(String desk,JTextArea disp) {
        this.desk = desk;
        this.display=disp;
    }

    public String getDesk() {
        return desk;
    }
    public void processCustomer(Customer cus){
        int price=0;
        StringBuilder sb=new StringBuilder();
        sb.append("\t\t"+desk+"\n");
        sb.append(cus.getName()+" is dropping off 1 bag of "+ cus.getLuggage()+"kg.");
        if(cus.getLuggage()>20){
            price=35;
            sb.append("\nA Baggage fee of "+price+" is due");
        }
        display.setText(sb.toString());
    }
    
    @Override
    public void run(){
        boolean status = Airport.customerQueue.isEmpty();
        while (true) {
            Customer customer = Airport.customerQueue.dequeue();
            if (customer != null) {
                processCustomer(customer);
                Airport.board(customer);
            }
            try {
                Thread.sleep(15000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Desk.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        
        
    }
    @Override
    public void start(){
        if(t==null){
            t=new Thread(this,desk);
            t.start();
        }
    }

}