【JAVA與C#比較】執行緒
阿新 • • 發佈:2018-12-26
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;