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;