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();下面是我的问题
当我想使用同一个对象时,我需要像下面那样做吗
我是否需要同步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();} }
# 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