C#とjavaの非同期操作の実現について
実はC#もJavaも非同期を実現する本質はマルチスレッドです.ただC#には依頼でこのマルチスレッドがカプセル化されています.呼び出し者には透明で、見えません.次に,最も単純で基本的な非同期呼び出しをC#とjavaでそれぞれ実現し,サブスレッドによるプライマリスレッドの更新操作はコールバック法により実現する.
C#の非同期呼び出し
C#ではスレッドを使用する方法が多く,依頼されたBeginInvokeとEndInvokeを使用する方法がその一つである.BeginInvokeメソッドは、スレッドを使用して、委任が指すメソッドを非同期で実行することができる.その後、EndInvokeメソッドでメソッドの戻り値(EndInvokeメソッドの戻り値は呼び出されたメソッドの戻り値)を取得するか、メソッドが正常に呼び出されたと判断します.EndInvokeメソッドから4つのメソッドで戻り値を取得できます.
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(" !");
}
}