如何同步线程池?

时间:2020-11-01 23:11:22

标签: java multithreading

我的家庭作业是关于实现一个应用程序,该应用程序通过线程允许我在不同文件夹中搜索文件,这些线程将创建一个环形拓扑,其中每个线程都与后继线程和前任线程进行交互。.但是首先,我想在我的jframe上打印当前节点,下一个节点和上一个节点的ID。

特定于用户的用户要使用多少个线程,也就是要创建的独立窗口的数量。

但是我的问题是,我怎么知道呢?我想如果我在for循环中使用'i'进行操作,然后像i + 1一样递增它,则打印以下内容不是正确的方法。

这是我的构造函数,在其中给出for循环的索引 然后我有Run方法将其打印到jframe

public tareaHilo(int id) {
    initComponents();
    this.idHilo = id;
}
public void run() {
            this.setVisible(true);
            numeroHilo.setText(Integer.toString(idHilo));
            nodoPrecedente.setText("previous one");
            nodoSubsecuente.setText("next one");
        }

//这是另一堂课

private void botonCrearActionPerformed(java.awt.event.ActionEvent evt) {                                           
    try {
        tareaHilo tarea;
        numHilos = Integer.parseInt(inputHilos.getText());
        ExecutorService ex = Executors.newFixedThreadPool(numHilos);
        for (i = 1; i <= numHilos; i++) {
            tarea = new tareaHilo(i);
            ex.execute(tarea);
        }
        this.setVisible(false);
    } catch (Exception e) {
        e.printStackTrace();
    }
}    

1 个答案:

答案 0 :(得分:2)

Swing是单线程的。不要使用ExecutorService执行此操作。请改用Swing计时器。像这样:

public tareaHilo(int id) {
    initComponents();
    this.idHilo = id;
}
int i;
public void actionPerformed(ActionEvent ae) {
            this.setVisible(true);
            numeroHilo.setText("" + i);
            i++;
            nodoPrecedente.setText("Hilo Anterior #");
            nodoSubsecuente.setText("Hilo Siguiente #");
        }

private void botonCrearActionPerformed(java.awt.event.ActionEvent evt) {                                           
    try {
        tareaHilo tarea;
        numHilos = Integer.parseInt(inputHilos.getText());
        javax.swing.Timer t = new javax.swing.Timer();
        t.scheduleAtFixedRate(...)
        this.setVisible(false);
    } catch (Exception e) {
        e.printStackTrace();
    }
}    

我让您填写了scheduleAtFixedRate参数,并确定何时/如何停止计时器操作