2012-08-01 16 views
2

這裏是我的問題: -如何在日常工作中管理單獨的線程/作業?

我在建立一個客戶端 - 服務器應用程序,我發佈請求到服務器的過程中產生2 XML對我的(服務器獲取從DB中的信息,並生成基於XML在這個獲取的信息)。現在,一旦服務器創建了這兩個XML,服務器就會將這兩個文件返回給客戶端,以便客戶端可以將它們保存在他們的機器上。

(張貼+從流中讀取)是一個作業。沒有第二個操作,即從流中讀取,作業是不完整的。

我在eclipse中創建了一個Job,它將請求發送到服務器,並將流式文件傳輸並保存在客戶機上。向服務器發送請求是一個異步調用(它將立即返回)。一旦呼叫被髮送並立即返回,我開始在任何數據服務器發送的網絡管道上進行輪詢(在這種情況下,它是XML的數據)&將其寫入文件中。

正如你在這裏看到的,從流中讀取XML並將它們寫入文件是整個主Job的一部分,但它本身仍然是一個單獨的工作(應該在單獨的線程中運行)。如果用戶取消主要作業,則從網絡流中讀取也應取消。

所以,基本上我的要求是完成這件事的一個可行的工作。從流中讀取應該是單獨的Thread/Job,但應該放在主Job中。如果用戶取消主要工作,這個內部工作(從工作中讀取)也應該取消。

你們可以建議一個乾淨的方法嗎?

-Ankit

回答

3

您可以創建一個mainjob和mainjob內您可以創建一個子作業。如果主要作業被取消,您可以將取消委託給子作業。

我用兩個按鈕創建了一個簡單的視圖。一個用於開始工作,另一個用於取消。

package rcpexperiments; 

import org.eclipse.core.runtime.IProgressMonitor; 
import org.eclipse.core.runtime.IStatus; 
import org.eclipse.core.runtime.Status; 
import org.eclipse.core.runtime.jobs.IJobChangeEvent; 
import org.eclipse.core.runtime.jobs.Job; 
import org.eclipse.core.runtime.jobs.JobChangeAdapter; 
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.Composite; 
import org.eclipse.ui.part.ViewPart; 

public class View extends ViewPart 
{ 
    private Job mainJob; 

    @Override 
    public void createPartControl(final Composite parent) 
    { 
    final Button button = new Button(parent, SWT.PUSH); 
    button.setText("Start Job"); 
    button.addSelectionListener(new SelectionAdapter() 
    { 

     @Override 
     public void widgetSelected(final SelectionEvent e) 
     { 
     mainJob = new Job("Main Job") 
     { 

      private boolean canceled = false; 

      @Override 
      protected void canceling() 
      { 
      System.out.println("Cancel requested."); 
      canceled = true; 
      } 

      @Override 
      protected IStatus run(final IProgressMonitor monitor) 
      { 
      final Job subJob = createSubJob(); 
      subJob.schedule(); 
      canceled = false; 
      while (!canceled) 
      { 
       try 
       { 
       Thread.sleep(100); 
       } 
       catch (final InterruptedException e) 
       { 
       } 
      } 
      subJob.cancel(); 
      System.out.println("Main Job is canceled."); 
      return Status.CANCEL_STATUS; 
      } 

      private Job createSubJob() 
      { 
      return new Job("Sub Job") 
      { 
       boolean subJobCancel = false; 

       @Override 
       protected void canceling() 
       { 
       subJobCancel = true; 
       } 

       @Override 
       protected IStatus run(final IProgressMonitor monitor) 
       { 
       System.out.println("Sub Job started."); 
       while (!subJobCancel) 
       { 
        try 
        { 
        Thread.sleep(100); 
        } 
        catch (final InterruptedException e) 
        { 
        } 
       } 
       System.out.println("Sub Job canceled"); 
       return Status.CANCEL_STATUS; 
       } 

      }; 
      } 

     }; 
     mainJob.addJobChangeListener(new JobChangeAdapter() 
     { 
      @Override 
      public void done(final IJobChangeEvent event) 
      { 
      System.out.println("Job finished by " + event.getResult()); 
      } 
     }); 
     mainJob.schedule(); 

     System.out.println("Main Job started."); 
     }; 

    }); 
    final Button cancel = new Button(parent, SWT.PUSH); 
    cancel.setText("Cancel"); 
    cancel.addSelectionListener(new SelectionAdapter() 
    { 

     @Override 
     public void widgetSelected(final SelectionEvent e) 
     { 
     mainJob.cancel(); 
     } 

    }); 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setFocus() 
    { 
    } 

} 

我希望這是你想要的。

+0

如果該答案有幫助,請接受它。 – 2012-08-02 07:03:24

+0

非常感謝邁克爾。這與我所需要的非常接近。你的回答肯定給了我一個方向。我將根據我的要求修改代碼。再次感謝 – user1522820 2012-08-02 18:53:37

1

在我看來,像Micheal K.所建議的那樣,定義subjobs有點麻煩。所以我去尋找到Eclipse的文檔,發現Job類定義了一個名爲createProgressGroup靜態方法,可以如下(同DOC)使用其做大致相同的事情:

Job parseJob, compileJob; 
IProgressMonitor pm = Job.getJobManager().createProgressGroup(); 
try { 
    pm.beginTask("Building", 10); 
    parseJob.setProgressGroup(pm, 5); 
    parseJob.schedule(); 
    compileJob.setProgressGroup(pm, 5); 
    compileJob.schedule(); 
    parseJob.join(); 
    compileJob.join(); 
} finally { 
    pm.done(); 
} 

請注意IJobManager。 getJobManager已棄用。

相關問題