以下是从http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/SWTandThread.htm
创建的示例import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
public class MultiThread extends Shell {
Button btnNewButton = new Button(this, SWT.NONE);
/**
* Launch the application.
* @param args
*/
public static void main(String args[]) {
try {
Display display = Display.getDefault();
MultiThread shell = new MultiThread(display);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the shell.
* @param display
*/
public MultiThread(Display display) {
super(display, SWT.SHELL_TRIM);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
applicationThread.start();
}
});
btnNewButton.setBounds(86, 47, 68, 23);
btnNewButton.setText("New Button");
createContents();
}
/**
* Create contents of the shell.
*/
protected void createContents() {
setText("SWT Application");
setSize(450, 300);
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
final Runnable print = new Runnable() {
public void run() {
System.out.println("Print from thread: \t" + Thread.currentThread().getName());
}
};
final Thread applicationThread = new Thread("currentThread") {
public void run() {
System.out.println("Hello from thread: \t" + Thread.currentThread().getName());
getDisplay().syncExec(print);
System.out.println("Bye from thread: \t" + Thread.currentThread().getName());
}
};
}
我的问题是:为什么第二次点击按钮会发生IllegalThreadStateException?是因为第二次单击创建了一个与之前同名的线程吗?我怎么能避免这种情况?
提前谢谢!
答案 0 :(得分:1)
使用下面的代码设置线程名称
Thread.currentThread().setName("Hello");
答案 1 :(得分:0)
我希望你再次启动一个线程而不实例化一个线程对象,这将导致java.lang.IllegalThreadStateException .. 例如,如果您通过实例化启动一个线程并调用start来开始执行一个线程。再次,如果你调用thread.start将导致java.lang.IllegalThreadStateException .. 您尝试在代码中实现的相同功能。 单击按钮后,您正在执行一个线程并通过调用thread.start()再次启动线程。
对于每个按钮单击,您应该通过实例化线程对象来启动新线程()。
答案 2 :(得分:0)
来自the documentation of Thread.start
:
引发
IllegalThreadStateException - 如果线程已经启动。
您没有创建具有相同名称的新线程,您再次在同一个线程上调用start()
并获得文档承诺的内容。
看来,无论是谁做了这个例子都没有考虑用户多次点击按钮的可能性......
答案 3 :(得分:0)
问题是你不能两次开始相同的线程:检查javadoc
不止一次启动线程永远不合法。特别是,a 一旦完成执行,线程可能无法重新启动。