方法内使用 new Thread() 是什么意思,有什么好处

DayDreamer922 2012-03-08 10:38:17
public void setEditingConfig(){//这是一个方法
new Thread(){
public void run() {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
}
}
}
}.start();
}

哪位兄弟说明一下,方法内这样写的好处是什么?能不能每一行都注释一下,谢谢、、、
...全文
20197 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
DayDreamer922 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lujintao123 的回复:]
首先swing是单线程的,这个是这篇文章的前提,也是意义所在,当swing界面程序启动的时候,会启动3个进程,
1、主线程
2、系统工具包线程:负责捕获操作系统事件,然后将事件转换成swing的事件,然后发送到事件派发线程EDT
3、事件派发线程(EDT):将事件派发到各个组件,并负责调用绘制方法更新界面

所有的事件,例如键盘,鼠标事件,都会由工具包线程转换成swing事件,然后放到事……
[/Quote]
讲的很有道理、、、、
  • 打赏
  • 举报
回复
首先swing是单线程的,这个是这篇文章的前提,也是意义所在,当swing界面程序启动的时候,会启动3个进程,
1、主线程
2、系统工具包线程:负责捕获操作系统事件,然后将事件转换成swing的事件,然后发送到事件派发线程EDT
3、事件派发线程(EDT):将事件派发到各个组件,并负责调用绘制方法更新界面

所有的事件,例如键盘,鼠标事件,都会由工具包线程转换成swing事件,然后放到事件队列EventQueue中,而这个EventQueue的派发机制是由EDT来管理的。

所以任何修改组件状态的方法都应该在EDT中执行,包括构造方法。Swing这样的构造原理经常会造成的情况就是,在EDT中执行长时间的事件,使EDT不能及时响应更新界面的事件,就是所说的界面卡住,这种不光是新手就是比较熟练的程序员也会犯的一个错误。所以必须避免在EDT中执行长时间的操作,而避免的方法就是多线程,启动另外的线程来处理冗长的操作,比如操作数据库,读写文件等,在这过程中可能要更新界面来给用户以提示,比如显示一个进度条,过一段事件更新一下界面,但是在EDT以外的线程中更新界面都是无效的,这在前面已经说过,要更新界面就要将对界面的更新操作放到EDT中,但是事件又是在另外的线程中执行的,要解决这个问题就要使用SwingUtilities提供的一个方法了 invokeLater,
public void actionPerformed(ActionEvent e){
new Thread(new Runnable(){
//do something
SwingUtilities.invokeLater(new Runnable(){
pulic void run(){
//update the GUI
}
});
}).start;
}
这个方法的作用就是将一个更新界面的任务放到EDT中,EDT会在适当的时候进行调用以更新界面。invokeLater负责创建一个含有Runnable的特定事件,并让其在EDT中排队等待调用,当被调用时就会运行Runnable中的run方法进行派发。
loveyuck 2012-03-08
  • 打赏
  • 举报
回复
方法内使用 new Thread()就是在方法内创建一个新的现成。后面的{}实际是重写Thread类的run方法(匿名内部类的运用)。
run方法里的:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
}
不太懂哦,没学过。
后面的.start();是启动前面new出来的那个现成,即执行线程里的run()方法。
具体的好处你可以找一下匿名内部类的优点。



MiceRice 2012-03-08
  • 打赏
  • 举报
回复
情况有点复杂,SwingUtilities.invokeLater(new Runnable() 其实没有创建线程。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧