今天学习了下 eclipse 从入门到精通的 SWT 多线程,但是一直有问题,我感觉现在完全是按照那里面的代码写的怎么还是出错

org.eclipse.swt.SWTException : Failed to execute runnable (java.lang.StackOverflowError)

    at org.eclipse.swt.SWT.error( SWT.java:2942 )

    at org.eclipse.swt.SWT.error( SWT.java:2865 )

    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages( Synchronizer.java:126 )

    at org.eclipse.swt.widgets.Display.runAsyncMessages( Display.java:3057 )

    at org.eclipse.swt.widgets.Display.readAndDispatch( Display.java:2716 )

    at com.swtprocessmonitor.TaskGUI.open( TaskGUI.java:77 )

 

       while (!shell.isDisposed()) {

           if (!display.readAndDispatch())//77

              display.sleep();}

    at com.swtprocessmonitor.TaskGUI.main( TaskGUI.java:87 )

 

Caused by: java.lang.StackOverflowError

org.eclipse.swt.SWTException : Failed to execute runnable (java.lang.StackOverflowError)

    at org.eclipse.swt.SWT.error( SWT.java:2942 )

    at org.eclipse.swt.SWT.error( SWT.java:2865 )

    at org.eclipse.swt.widgets.Synchronizer.syncExec( Synchronizer.java:178 )

    at org.eclipse.swt.widgets.Display.syncExec( Display.java:3413 )

    at com.swtprocessmonitor.Task.moveProgressBar( Task.java:68 )

    at com.swtprocessmonitor.Task.start( Task.java:32 )

    at com.swtprocessmonitor.TaskGUI$3.run( TaskGUI.java:59 )

Caused by: java.lang.StackOverflowError

不知道该专门解决了

 

我的 TaskGUI.java

 

package com.swtprocessmonitor;

 

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.SelectionAdapter;

import org.eclipse.swt.events.SelectionEvent;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.ProgressBar;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Text;

 

public class TaskGUI {

      

 

      

       final Display display = Display.getDefault();

       final Shell shell = new Shell();

       private Task task=new Task(this);

       private Button Execue_button = new Button(shell, SWT.NONE);

       private Button stop_Button = new Button(shell, SWT.NONE);

       private ProgressBar progressBar;

       private Text taskCountText;

       private Text consoletext;

       public void open()

       {

              shell.setSize(500, 375);

              shell.setText("SWT Application");

              shell.open();

 

             

              Execue_button.setText("Execue");

              Execue_button.setBounds(211, 52, 101, 25);

 

 

              stop_Button.setText("stop");

              stop_Button.setBounds(348, 52, 79, 25);

              stop_Button.addSelectionListener(new SelectionAdapter() {

                     public void widgetSelected(SelectionEvent e) {

                            task.stop();

                     }

              });

 

              consoletext = new Text(shell, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER);

              //consoletext.setLayoutData();

              consoletext.setBounds(93, 141, 277, 156);

 

              Execue_button.addSelectionListener(new SelectionAdapter() {

                     public void widgetSelected(SelectionEvent e) {

                             setButtonState(false);

                             String  str=taskCountText.getText();

                             final int inttaskCount=Integer.parseInt(str);

                             System.out.println(inttaskCount+"inttaskCount");

                             progressBar.setMaximum(inttaskCount-1);

                             

                             consoletext.insert("back door thread start!");

                             new Thread()  {

                                   public void run() {

                                         

                                          task.start(inttaskCount);

                                   }

 

                            }.start();

                             

                           

                           

                     }

              });

               progressBar = new ProgressBar(shell, SWT.NONE);

              progressBar.setBounds(89, 105, 276, 30);

 

              taskCountText = new Text(getShell(), SWT.BORDER);

              taskCountText.setBounds(72, 50, 120, 30);

              shell.layout();

             

              shell.setLocation(6, -9);

              while (!shell.isDisposed()) {

                     if (!display.readAndDispatch())

                            display.sleep();}

             

       }

      

      

       public static void main(String[] args) {

 

              try {

                     TaskGUI tg=new TaskGUI();

                     tg.open();

              } catch (RuntimeException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

      

       }

       public void  setButtonState(boolean bFlag)

       {

              this.Execue_button.setEnabled(bFlag);

 

              this.stop_Button.setEnabled(!bFlag);

       }

      

       public Shell getShell()

       {

              return shell;

       }

       public Text getConselText()

       {

              return this.consoletext;

       }

       public ProgressBar getProgressBar()

       {

              return this.getProgressBar();

       }

}

 

 

 

我的 Task.java

 

package com.swtprocessmonitor;

import org.eclipse.swt.widgets.Display;

public class Task {

       private TaskGUI tg;

       private boolean stopFlag;

       Task(TaskGUI tg)

       {

              this.tg=tg;

       }

       public void stop()

       {

              stopFlag=true;

       }

       public void start(int taskCount)

       {

              stopFlag=false;

              insertConselText("stat!");

              for(int i=0;i<taskCount;i++)

              {

                     if(stopFlag)

                     {

                            break;

                     }

                     try {

                            Thread.sleep(1000);

                     } catch (InterruptedException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                     }

                    

                     insertConselText(i+"");

                     moveProgressBar(i);

                    

                    

              }

             

              insertConselText("finish");

              setTaskButtonstate(true);

             

             

       }

       public void setTaskButtonstate(final boolean bFlag)

      

       {

              Display.getDefault().syncExec(new Runnable(){

                     public void run()

                     {

                            tg.setButtonState(bFlag);

                     }

                    

              });

       }

       public void insertConselText(final String str)

      

       {

              Display.getDefault().syncExec(new Runnable(){

                     public void run()

                     {

                            tg.getConselText().insert(str);

                     }

                    

              });

       }

      

       public void moveProgressBar(final int progress)

      

       {

              Display.getDefault().syncExec(new Runnable(){

                     public void run()

                     {

                            tg.getProgressBar().setSelection(progress);

                     }

                    

              });

       }

 

 

}

 

 

 哪位大哥能帮忙解决下

谢谢!!