当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

Java多线程及同步实现原理[Java编程]

赞助商链接



  本文“Java多线程及同步实现原理[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

一. 实现多线程

1. 虚假的多线程

例1:

public class TestThread
{
  int i=0, j=0;
  public void go(int flag)
  {
   while(true)
   {
    try{ Thread.sleep(100);
   }
   catch(InterruptedException e)
   {
    System.out.println("Interrupted");
   }
   if(flag==0) i++;
   System.out.println("i=" + i);
   }
   else
   {
    j++;
    System.out.println("j=" + j);
   }
  }
}
public static void main(String[] args)
{
  new TestThread().go(0);
  new TestThread().go(1);
}
}

上面程序的运行后果为:

i=1

i=2

i=3

...

后果将一向打印出I的值.我们的企图是当在while循环中调用sleep()时,另一个线程就将起动,打印出j的值,但后果却并非这样.关于sleep()为什么不会呈现我们预想的后果,在下面将讲到.

2. 实现多线程

通过担当class Thread或实现Runnable接口,我们可以实现多线程

2.1 通过担当class Thread实现多线程

class Thread中有两个最重要的函数run()和start().

1) run()函数必须举行覆写,把要在多个线程中并行处理的代码放到这个函数中.

2) 固然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数.在调用start()的时刻,start()函数会首先举行与多线程相关的初始化(这也是为什么不能直接调用run()函数的缘由),然后再调用run()函数.

例2:

public class TestThread extends Thread
{
  private static int threadCount = 0;
  private int threadNum = ++threadCount;
  private int i = 5;
  public void run()
  {
   while(true)
   {
    try
    {
     Thread.sleep(100); 
    }
    catch(InterruptedException e)
    {
     System.out.println("Interrupted");
    }
    System.out.println("Thread " + threadNum + " = " + i);
    if(--i==0) return;
   }
  }
  public static void main(String[] args)
  {
   for(int i=0; i<5; i++)
    new TestThread().start();
  }
}

运行后果为:

Thread 1 = 5

Thread 2 = 5

Thread 3 = 5

Thread 4 = 5

Thread 5 = 5

Thread 1 = 4

Thread 2 = 4

Thread 3 = 4

Thread 4 = 4

Thread 1 = 3

Thread 2 = 3

Thread 5 = 4

Thread 3 = 3

Thread 4 = 3

Thread 1 = 2

Thread 2 = 2

Thread 5 = 3

Thread 3 = 2

Thread 4 = 2

Thread 1 = 1

Thread 2 = 1

Thread 5 = 2

Thread 3 = 1

Thread 4 = 1

Thread 5 = 1

从后果可见,例2能实现多线程的并行处理.

**:在上面的例子中,我们只用new产生Thread对象,并没有效reference来记录所产生的Thread对象.按照垃圾回收机制,当一个对象没有被reference引用时,它将被回收.但是垃圾回收机制对Thread对象“不成立”.因为每一个Thread城市举行注册行动,所以即便我们在产生Thread对象时没有指定一个reference指向这个对象,实际上也会在某个地方有个指向该对象的reference,所以垃圾回收器无法回收它们.
  以上是“Java多线程及同步实现原理[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .