1. 程式人生 > >【JAVA與C#比較】執行緒

【JAVA與C#比較】執行緒

1.java中執行緒更多體現的是類的思想,所以可以通過繼承Thread類,和實現Runnable介面來建立執行緒。使用繼承Thread類的方法來建立執行緒類時,多個執行緒間無法共享執行緒類的例項變數。而C#更多體現的是委託的思想,通過將方法體作為引數構造執行緒類。

public class MyThread extends Thread{     //繼承Thread類
  public void run(){
  //重寫run執行緒方法
  }
}
public class MyThread2 implements Runnable {//實現Runnable介面
  public void run(){
  //重寫run執行緒方法
  }
}
new MyThread().start();              //建立並啟動執行緒MyThread
new Thread(new MyThread2()).start(); //建立愛你並啟動執行緒MyThread2
public void ThreadSend()  
{  
   Thread.Sleep(1000);  //執行緒方法
}                  
new Thread(ThreadSend).Start();      //建立並啟動執行緒ThreadSend   

2.java中執行緒的同步機制使用synchronized關鍵字,分為同步塊、同步方法和同步鎖三種方式,而C#中使用lock關鍵字,體現的是同步變數思想。
class compute extends Thread{  //同步塊
  public void run(){
    synchronized(Object){      //Object為標誌位,或者需要同步操作處理的變數
      print();
      ...//
    }
  } 
  public void print(){
    ...//
  }
}

class compute extends Thread{  //同步方法
  public void run(){
    print();
    ...//
  }
  synchronized void print(){
    ...//
  } 
}

public class compute{          //同步鎖
  private final ReentrantLock lock = new ReentrantLock();
  public void print(){
    lock.lock();
    ...//
    lock.unlock();
  }
}

Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section
}

3.java中執行緒間傳遞資料通過建構函式實現,C#中通過傳遞object物件後再轉換為需要的型別實現。
class compute extends Thread{
  char ch;
  compute(char ch){
    this.ch=ch;
  }

  public void run(){
    ...//
  }
}
private void Compute(object parameter)
{
  char ch=(char)parameter;
}

4.Java8之後可以用Lambda表示式建立有返回值的執行緒,而C#可以直接將有返回值的函式作為引數,放到執行緒當中來實現。
FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
  int i = 0; 
  ...//
  return i;
})
new Thread(task,"有返回值的執行緒").start();
int value = task.get();  //獲取執行緒返回值
Task<int> task = Task.Factory.StartNew<int>(() =>
{
    int i = 0;
    ...//
    return i;
});
int taskResult = task.Result;