看了很多大神对asyncExec的讲解,对于刚学swt不久的我,显然还是很深奥的。
所以还是自己写了两个例子对比一下,有不对的请指出来
在非ui线程中更新ui,有两种方法
1:asyncExec
2:syncExec
其中两个方法的可以用两个例子看出来:
1.asyncExec 用法实例
protected void createContents() {
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
try {
System.err.println("开始倒计时了");
Thread.sleep(3000);
} catch (InterruptedException e1) {
//e1.printStackTrace();
}
System.err.println("倒计时完成");
}
});
new Thread( new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
tt = false;
System.err.println("循环停止");
}
}).start();
System.err.println("这里不会因为asyncExec而阻塞");
System.err.println("开始循环");
while (tt) {
System.err.println("循环中");
}
}
以上程序的输出为
这里不会因为asyncExec而阻塞
开始循环
循环中
循环中
。。。。
循环中
循环停止
开始倒计时了
倒计时完成
从以上例子可以看出asyncExec实现了一种异步的运行方式,当调用此asyncExec的方法的语句全部运行完成,才会去调用asyncexec方法
2.syncExec实例
protected void createContents() {
Main.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
try {
System.err.println("开始倒计时了");
Thread.sleep(3000);
} catch (InterruptedException e1) {
//e1.printStackTrace();
}
System.err.println("倒计时完成");
}
});
new Thread( new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tt = false;
System.err.println("循环停止");
}
}).start();;
System.err.println("这里因为syncExec阻塞,要等到倒计时完成之后才会运行");
System.err.println("开始循环");
while (tt) {
System.err.println("循环中");
}
}
以上程序输出如下
开始倒计时了
倒计时完成
这里因为syncExec阻塞,要等到倒计时完成之后才会运行
开始循环
循环中
循环中
。。。。
循环中
循环停止
通过以上例子可以看出syncExec会马上阻塞到ui线程的运行,需要等到syncExec方法内的倒计时完全之后开会开始循环。
但两个方法都是占用ui线程,所以在调用前后台交互,或者包含阻塞方法而不想ui阻塞时,要先新建一个线程,然后完成这个方法,然后再来调用syncexec或asyncexec方法。
new Thread(new Runnable() {
@Override
public void run() {
//这里去请求后台,会卡死噢,但你新建了一个线程所以不会影响到ui界面的运行。
final PostDataModel pdm = ControlFactory.login(new Data(GlobalData.userName, GlobalData.userPwd), false);
//请求完成了。下面更新ui;
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
//方法体内更新ui,由于只是刷新界面,并没有复杂的业务,所以整个界面都很柔顺
}
});
}
}).start();
所以还是自己写了两个例子对比一下,有不对的请指出来
在非ui线程中更新ui,有两种方法
1:asyncExec
2:syncExec
其中两个方法的可以用两个例子看出来:
1.asyncExec 用法实例
protected void createContents() {
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
try {
System.err.println("开始倒计时了");
Thread.sleep(3000);
} catch (InterruptedException e1) {
//e1.printStackTrace();
}
System.err.println("倒计时完成");
}
});
new Thread( new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
tt = false;
System.err.println("循环停止");
}
}).start();
System.err.println("这里不会因为asyncExec而阻塞");
System.err.println("开始循环");
while (tt) {
System.err.println("循环中");
}
}
以上程序的输出为
这里不会因为asyncExec而阻塞
开始循环
循环中
循环中
。。。。
循环中
循环停止
开始倒计时了
倒计时完成
从以上例子可以看出asyncExec实现了一种异步的运行方式,当调用此asyncExec的方法的语句全部运行完成,才会去调用asyncexec方法
2.syncExec实例
protected void createContents() {
Main.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
try {
System.err.println("开始倒计时了");
Thread.sleep(3000);
} catch (InterruptedException e1) {
//e1.printStackTrace();
}
System.err.println("倒计时完成");
}
});
new Thread( new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tt = false;
System.err.println("循环停止");
}
}).start();;
System.err.println("这里因为syncExec阻塞,要等到倒计时完成之后才会运行");
System.err.println("开始循环");
while (tt) {
System.err.println("循环中");
}
}
以上程序输出如下
开始倒计时了
倒计时完成
这里因为syncExec阻塞,要等到倒计时完成之后才会运行
开始循环
循环中
循环中
。。。。
循环中
循环停止
通过以上例子可以看出syncExec会马上阻塞到ui线程的运行,需要等到syncExec方法内的倒计时完全之后开会开始循环。
但两个方法都是占用ui线程,所以在调用前后台交互,或者包含阻塞方法而不想ui阻塞时,要先新建一个线程,然后完成这个方法,然后再来调用syncexec或asyncexec方法。
new Thread(new Runnable() {
@Override
public void run() {
//这里去请求后台,会卡死噢,但你新建了一个线程所以不会影响到ui界面的运行。
final PostDataModel pdm = ControlFactory.login(new Data(GlobalData.userName, GlobalData.userPwd), false);
//请求完成了。下面更新ui;
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
//方法体内更新ui,由于只是刷新界面,并没有复杂的业务,所以整个界面都很柔顺
}
});
}
}).start();