有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java理解EDT和共享对象?

大家好,我正在尝试理解EDT与多线程的区别,如果这不合理,希望有人能纠正我

首先,我将GUI的创建过程放在它自己的线程中 然后加入EDT

public class Main 
{
static ServerGui serverGui;
public static void main(String[] args)  {
    SwingUtilities.invokeLater(new Runnable()  {
        public void run()   {
            try{
                serverGui = new ServerGui();
                serverGui.frame.setVisible(true);
            }
            catch(Exception e)
            {
                e.printStackTrace();    }} });}}

在我的GUI中,我创建了ServerDataHandler对象sdh

public class ServerGui {
public ServerDataHandler sdh = new ServerDataHandler();

public JFrame frame;

public ServerGui() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setType(Type.NORMAL);
    frame.setBounds(100, 100, 800, 600); }  }

现在从另一个线程开始,我希望使用sdh对象,并使用一些方法 事实上。。e、 g.sdh。writeToFile();下面是我的问题

  1. 当我想使用同一个对象时,我需要像下面那样做吗

  2. 我是否需要同步ServerDataHandler类,例如,在我的例子中,该方法写入文件?我想是的

  3. 我什么时候需要使用“调用器”?这就是我在实际GUI中更改的时候吗

客户

public class Client implements Runnable {

private Socket clientSocket;

public Client(Socket clientSocket) {
    this.clientSocket = clientSocket;

@Override
public void run() {
    Main.serverGui.sdh.writeToFile();} }

共 (1) 个答案

  1. # 1 楼答案

    类和对象

    您创建的Main、Client、ServerGui和ServerDataHandler类就是这些类。调用类的构造函数时,创建的对象是该类的实例

    每个线程在JVM中的对象中穿行,遵循执行路径,就像一个对象中的方法调用另一个对象中的方法一样。因此,对象只是位于JVM中,并没有专门绑定到线程

    线程

    JVM内部也有多个线程。您可以使用java.lang.Thread类中的方法自己创建和销毁它们。但是主线程和事件调度线程是为您创建的

    作为Runnable类实例的对象可以在一个线程中创建,然后交给另一个线程运行。这就是你调用SwingUtilities.invokeLater时所做的。创建一个匿名Runnable对象,并将其run()方法安排为由事件调度线程调用

    事件调度线程

    这样做的原因是Swing对象不是线程安全的,也就是说,一次不能被多个线程处理。它们的方法,比如setVisible(true),应该由事件调度线程一次调用一个

    您分配给Swing对象的侦听器中的事件处理方法将在事件调度线程上调用。在调用它们的过程中,事件调度线程正忙于遍历事件处理程序代码,无法在屏幕上绘制像素或对按钮单击做出反应。因此,如果您希望用户界面具有响应性,那么应该保持事件处理代码的简短和快速

    如果你想运行长时间的任务,比如阅读长文件,或者与服务器聊天,你应该创建并启动一个新的线程来运行这个任务。这被称为后台线程或工作线程。可以为要运行的作业创建一个可运行类,并将其提供给已创建的线程

    一种更高级的任务调度方法是通过java中的类。util。并发包,尤其是Executor服务

    有更多信息的好教程是Concurrency in Swing