Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解EDT和共享对象?_Java_Multithreading_Event Dispatch Thread - Fatal编程技术网

Java 了解EDT和共享对象?

Java 了解EDT和共享对象?,java,multithreading,event-dispatch-thread,Java,Multithreading,Event Dispatch Thread,嗨,我正在尝试理解EDT和多线程,希望有人能纠正我,如果这不合理的话 首先,我将GUI的创建过程放在它自己的线程中,即 然后加入EDT public class Main { static ServerGui serverGui; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() {

嗨,我正在尝试理解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();下面是我的问题

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

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

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

  • 客户

    public class Client implements Runnable {
    
    private Socket clientSocket;
    
    public Client(Socket clientSocket) {
        this.clientSocket = clientSocket;
    
    @Override
    public void run() {
        Main.serverGui.sdh.writeToFile();} }
    

    类和对象

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

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

    线程

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

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

    事件调度线程

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

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

    如果要运行较长的任务,如读取长文件或与服务器聊天,则应创建并启动新线程以运行此任务。这称为后台线程或工作线程。您可以为要运行的作业创建一个可运行类,并将其提供给已创建的线程

    调度任务的一种更高级的方法是通过java.util.concurrent包中的类,特别是ExecutorService

    一个包含更多信息的好教程是