如何重命名Java的线程

时间:2015-03-09 15:51:14

标签: java multithreading

以下是从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?是因为第二次单击创建了一个与之前同名的线程吗?我怎么能避免这种情况?

提前谢谢!

4 个答案:

答案 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   一旦完成执行,线程可能无法重新启动。