Java 了解EDT和共享对象?
嗨,我正在尝试理解EDT和多线程,希望有人能纠正我,如果这不合理的话 首先,我将GUI的创建过程放在它自己的线程中,即 然后加入EDTJava 了解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() {
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();下面是我的问题
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
一个包含更多信息的好教程是