2013-11-25 4 views
0

Привет, я пытаюсь понять EDT против Multithreading, надеясь, что кто-то может исправить меня, если это не имеет смысла.Понимание EDT и разделение объектов?

Сначала я поставил создание процесса графического интерфейса в отдельном потоке, который затем добавляется в 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 СЕ

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 и использовать некоторые из методов , которые он имеет ... например sdh.writeToFile(); так что вот мои вопросы

  1. Как я хочу использовать один и тот же объект, мне нужно сделать это, как будто я внизу ?.

  2. Нужно ли мне синхронизировать класс ServerDataHandler, например, в моем случае метод записывается в файл? Я подозреваю, что я делаю

  3. Когда мне нужно использовать 'invokeLater'? это то, что я изменяю в самом графическом интерфейсе?

Client

public class Client implements Runnable { 

private Socket clientSocket; 

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

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

ответ

0

Классы и объекты

Основные, Клиент, ServerGui и ServerDataHandler классы, которые вы создали только что классы. Когда вы вызываете конструктор класса, вы создаете объект, являющийся экземпляром класса.

Каждый поток прокладывает себе путь через объекты в JVM, следуя пути выполнения как метод в одном объекте, вызывает метод в другом объекте. Таким образом, объекты просто сидят в JVM и не привязаны конкретно к потокам.

Темы

Также внутри JVM живут несколько потоков. Вы можете создавать и уничтожать их самостоятельно, используя методы в классе java.lang.Thread. Но основной поток и Тема Дискуссии Событий созданы для вас.

Объект, являющийся экземпляром класса Runnable, может быть создан в одном потоке и затем передан для запуска другим потоком. Это то, что вы делаете, когда звоните SwingUtilities.invokeLater. Вы создаете анонимный объект Runnable и планируете его метод run(), который будет вызываться потоком Dispatch Event.

событий Отправка Thread

Причина этого является то, что распашные объекты не поточно-, т.е. не написано быть обработано более одного потока одновременно. Их методы, такие как setVisible(true), должны быть вызваны по событию Dispatch Thread, по одному за раз.

Методы обработки событий в слушателях, которые вы назначаете объектам Swing, будут вызваны в потоке Dispatch Event.В то время как они вызывают, Thread Dispatch Thread занят плетением кода вашего обработчика событий и недоступен для рисования пикселей на экране или реагирования на нажатия кнопок. Поэтому, если вы хотите, чтобы ваш пользовательский интерфейс был отзывчивым, вы должны держать код обработки событий коротким и быстрым.

Если вы хотите запускать длительные задачи, например, читать длинный файл или общаться с сервером, вы должны создать и запустить новый поток для выполнения этой задачи. Это называется потоком Background или Worker. Вы можете создать класс Runnable для задания, которое вы хотите запустить, и передать его в созданную вами нить.

Несколько более высокоуровневый способ планирования задач - это классы в пакете java.util.concurrent, в частности ExecutorService.

Хорошее учебное пособие с дополнительной информацией Concurrency in Swing

Смежные вопросы