C#とjavaの非同期操作の実現について


実はC#もJavaも非同期を実現する本質はマルチスレッドです.ただC#には依頼でこのマルチスレッドがカプセル化されています.呼び出し者には透明で、見えません.次に,最も単純で基本的な非同期呼び出しをC#とjavaでそれぞれ実現し,サブスレッドによるプライマリスレッドの更新操作はコールバック法により実現する.
C#の非同期呼び出し
C#ではスレッドを使用する方法が多く,依頼されたBeginInvokeとEndInvokeを使用する方法がその一つである.BeginInvokeメソッドは、スレッドを使用して、委任が指すメソッドを非同期で実行することができる.その後、EndInvokeメソッドでメソッドの戻り値(EndInvokeメソッドの戻り値は呼び出されたメソッドの戻り値)を取得するか、メソッドが正常に呼び出されたと判断します.EndInvokeメソッドから4つのメソッドで戻り値を取得できます.
 public class Program
    {
        private static int i = 0;
        public static void Main(string[] args)
        {
            BigWorkDelegate bigWork = new TestB().BigWork;//         
            AsyncCallback callBack = CallBack;//                  

            IAsyncResult result = bigWork.BeginInvoke(3000, callBack, bigWork);
            //   EndInvoke  ,       3 
            //int i = bigWork.EndInvoke(result);
            //Console.WriteLine("123");
            Console.ReadLine();
        }

        public static void CallBack(IAsyncResult result)
        {
            if (result == null)
                return;
            i = (result.AsyncState as BigWorkDelegate).EndInvoke(result);

            Console.WriteLine("              :  ="+i);
        }

    }

    public delegate int BigWorkDelegate(int second);

    /// <summary>
    ///       
    /// </summary>
    public class TestB
    {
        public int BigWork(int second)
        {
            Console.WriteLine("      ...");
            //      
            Thread.Sleep(second);
            Console.WriteLine("    ");
            return 1;
        }
    }

JAvaの非同期呼び出し
package com.rxb;

public class AsyncTask implements ICallBack {

	private int result = 0;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread thread = new Thread(new TestB(new AsyncTask(),2000));
		thread.start();
		System.out.println("      ");
	}

	//        ,  GUI            UI
	@Override
	public void callBack(int i) {
		// TODO Auto-generated method stub
		result = i;
		System.out.println("         :"+result);
	}

}

//    
interface ICallBack{
	void callBack(int i);
}

class TestB implements Runnable {
	private int second = 0;
	private ICallBack callBack;
	public TestB(ICallBack callBack,int mil){
		this.callBack = callBack;
		this.second = mil;
	}
	
	//             
	public void run() {
		System.out.println("      ......");
		try {
			
			Thread.sleep(second);
			//                 
			callBack.callBack(2);		
			
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("      !");
	}
}