这是我在这里发表的第一篇文章。我已经找到了答案,而我发现的答案并没有帮助我。 我想使用FutureTask运行一个简单的TCP服务器。 它应该等待客户端,直到按下按钮并且执行器停止。 我的窗口应用程序仅在我不使用while循环时出现。
有人可以帮我吗?
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(2);
TCPServer tcpServer = new TCPServer(15002, true);
FutureTask<Integer> ft = new FutureTask<>(tcpServer);
pool.execute(ft);
final JFrame frame = new JFrame("TCP Server");
final JLabel print = new JLabel("Program is executing!");
final JToggleButton switchButton = new JToggleButton("Cancel");
final JLabel status = new JLabel("Waiting for connection");
int i = 0;
while (!switchButton.isSelected() && !ft.isDone()) {
i++;
String temp = "Waiting for connection... " + i + " s.";
status.setText(temp);
int sleep = i*1000;
Thread.sleep(sleep);
}
switchButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED){
status.setText("Cancelled");
pool.shutdown();
}
}
});
frame.getContentPane().add(print, BorderLayout.NORTH);
frame.getContentPane().add(switchButton, BorderLayout.CENTER);
frame.getContentPane().add(status, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
答案 0 :(得分:0)
因为在调用frame.setVisible(true);
之前等待连接您需要重新排序初始化,如:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(2);
TCPServer tcpServer = new TCPServer(15002, true);
FutureTask<Integer> ft = new FutureTask<>(tcpServer);
pool.execute(ft);
final JFrame frame = new JFrame("TCP Server");
final JLabel print = new JLabel("Program is executing!");
final JToggleButton switchButton = new JToggleButton("Cancel");
final JLabel status = new JLabel("Waiting for connection");
switchButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
status.setText("Cancelled");
pool.shutdown();
}
}
});
frame.getContentPane().add(print, BorderLayout.NORTH);
frame.getContentPane().add(switchButton, BorderLayout.CENTER);
frame.getContentPane().add(status, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
int i = 0;
while (!switchButton.isSelected() && !ft.isDone()) {
i++;
String temp = "Waiting for connection... " + i + " s.";
status.setText(temp);
int sleep = i * 1000;
Thread.sleep(sleep);
}
}
}