java多线程和.net多线程区别与联系

在网上搜了好多,没有搜到这方面的内容,自己浅薄写点吧。

1、.net和java的主线程和子线程,原理是类似的

  (1)、当子线程是前台线程时,主线程结束,子线程并未结束(还将继续运行,即进程未结束)

   (2)、若是子线程改成后台线程,主线程结束,子线程也会结束(从而进程也会关闭)

     .net代码示例如下,java类似

/// <summary>
/// 测试主线程子线程结束先后问题
/// </summary>
static void TestThreadParentAndSon()
{
//通过ParameterizedThreadStart创建线程
string a = "ddd";
//此处,当子线程要传“形参”,需要用ParameterizedThreadStart来实力话(没有形参,用ThreadStart即可),
//java,多线程中,传递形参,也要用final修饰
//java,多线程中,共享的变量为何在main()里必须用final修饰
Thread thread = new Thread(new ParameterizedThreadStart(Thread1));
//此处可以证明,当子线程是前台线程时,主线程结束,子线程并未结束(还将继续运行,即进程未结束)
//若是子线程改成后台线程,主线程结束,子线程也会结束(从而进程也会关闭)
//默认是前台线程 //thread.IsBackground = true; //给方法传值 thread.Start(a); //此句,是输入参数,即可往下执行 Console.ReadKey(); Thread th = Thread.CurrentThread;//获取当前工作的线程 th.Abort(); } /// <summary> /// 创建有参的方法 /// 注意:方法里面的参数类型必须是Object类型 /// </summary> /// <param name="obj"></param> static void Thread1(object obj) { obj += "哈哈"; while (true) { Console.WriteLine(obj+" "+DateTime.Now); } }

2、java和.net中多线程的共享变量原理和实现方式,是很不一样的  

(1)、.net子线程可以使用主线程的变量,而且变量在子线程中改变,主线程中也会改变。如过是多个子线程的话,那么就会存在是否要加锁的问题

 static void Main(string[] args)
        {
            int sharedValue = 0;
            Thread t1 = new Thread(() => {
                // Do something.
                  sharedValue += 3;
                   Console.WriteLine("子线程值为a:"+sharedValue);
                Thread.Sleep(1000);
                Console.WriteLine("子线程值为b:" + sharedValue);
                Console.ReadLine();
            });
            t1.Start();
            sharedValue += 1;
            //Thread.Sleep(1000);
            Console.WriteLine("主线程结束a,共享值为:"+sharedValue);
            Thread th = Thread.CurrentThread;//获取当前工作的线程
            th.Abort();
            Console.WriteLine("主线程结束b,共享值为:" + sharedValue);
        }

(2)、对java来说,主线程向子线程传参,或者在子线程中使用主线程的变量,那么此变量都要加上final修饰

public class testcs {
//验证多线程,传参问题
public static void main(String[] args)
{
int c=3;
try {
System.out.println("hello world");
test(c);
} catch (Exception e) {
e.printStackTrace();
}
//File file = new File("D:\\dev3\\统一渠道管理\\EB.SaleChannelPlatform");
//deleteFiles(file);
}

/**
*
* @param b
*/
public static void test(final int b) {
final int a = 10;
//此时主线程条用test方法,那么此方法还在主线程里,只有到了下句new Thread并启动(thread里面的程序才属于子线程)
new Thread(){
public void run() {
System.out.println(a);
System.out.println(b);
};
}.start();
}
}

猜你喜欢

转载自www.cnblogs.com/pengzhong2007/p/9565504.html