CSDN博客

img kingd007

Thread & Java

发表于2004/7/1 10:27:00  3106人阅读

Thread & Java

 

现在大家对线程的概念都不陌生,现在的操作系统都从底层支持多线程,很多程序介绍自己时也加上多线程的说明,那么,为什么要引入多线程的概念呢?下面就简单的说一下。

进程是在线程前面提出的一种概念,多进程的出现,使得让人们感觉PC在同一时间可以干不止一件事情。多进程得思想简单得说就是把程序分成一个个得任务,在某一个任务因等待某种资源不能运行时让可以运行得任务运行,这样,可以使CPU得利用率大大加强。

但是进程有很多缺点,比如耗资源,速度慢,人们有想到了一种新的技术,这就是线程,其实线程和进程一样,都是让程序快速运行,并行运行,充分利用CPU时间的。

    为什么线程技术会越来越受重视呢?是因为在图形界面出现之后,必须有一个子任务在不断的监控按钮是否被按下,如果程序不能支持并行,那么可以说什么也不能做,为了解决并行的问题,人们想出了很多办法,比如说异步I/O,信号灯等机制,在这里我们主要说一下线程。说说线程的优点以及java中是如何支持线程的。

1:线程可以提高应用程序的相应。打个比方说,我们有一个程序要连接网络,从网络获取数据,在我们联网获取数据的时候如果是同一个线程,那么我们只能等待数据传输完毕后才可以进行其他操作,如果数据比较多,下载时间比较长,在这段时间里什么事情也干不了,肯定很恼火,但是如果是多线程的,我们启动另一个线程来联网下载数据,这个时候我们可以干别的事,比如听听音乐,玩玩游戏。你肯定会喜欢后者。

2:多线程使CPU的利用率更充分。再举个例子,我们在用IE 5 自带的下载工具下载软件时肯定没有flashget之类的下载软件快,那么是为什么呢?一个很重要的原因就是在flashget支持多线程,IE 5自带的下载软件不支持多线程。

3:占用更少的系统资源。
   
多线程还有其他很多优点,我们先说这么多。下面看看java对线程提供了怎样的支持。

现在的操作系统几乎都支持多线程,我们可以在这些操作系统上开发自己的多线程程序,但是,每一个操作一个中多线程的实现方法是有很大区别的,如果我们用了操作系统的提供的方法,那么跨平台几乎是不可能的,而java语言的优点就是跨平台,所以java采用了自己的机制,就是java语言直接支持多线程。也就是在语言本身和虚拟机中加入对多线程的支持。

java中,只要你了解线程的基本概念,就可以编写出多线程的程序。

Java提供了一个抽象类 Thread,该类里面有一个抽象的run()方法,我们在写程序时,只要继承于这个类,实现run()方法就可以了,在程序中,如果我们想用另一个线程来执行一些动作,这要把这些动作的代码写在run()方法中,然后再调用从Thread类继承来的start()方法,这时,jvm就负责创建一个新的线程,在新线程中执行那些代码,我们可以看看下面的例子:
    public class MyThread extends Thread

{

MyThread mt  = new MyThread();
       public static void main(String args[])

       {

              mt.start();

        for(int I = 0; I  < 100 ; I ++)

              {

                     System.out.println(“I = “ + I);

              }

       }

       public void run()

       {

              for(int j = 0; j < 100; j++)

              {

                     System.out.println(“j = “ + j);

              }

       }

}

在上面这个程序中,在执行到mt.start()时,jvm调用run()方法,在run()方法执行时,main()方法中的for循环也在同时执行。

java经验的朋友们看了上面的程序一定会问,那么,我们在写那些有固定结构的程序时,比如说写手机程序必须从MIDlet类中继承,applet程序必须从APPlet类中继承,我们的程序就不能再继承Thread类,如果要是多线程的,就必须再写一个继承自Thread的线程类。那么程序必须有两个类,是不是这样的?先告诉大家不是的,java提供了两中机制实现多线程。前面一种是继承形的,下面介绍一种通过接口实现的。

我们还是先看看一个程序:

import  java.applet.Applet;

 

public class MyThread extends Applet implements Runnable

{
              public void init()

       {

              MyThread mt = new OurClass();

              oc.start();

       }
              public void run()

       {

             for(int I = 0 ; I <  100; I++)

              {

                     System.out.println(“I = “ + I);

              }
              }
       }

大家现在是不是应该明白一点了呢,如果希望使用接口的方式来使用多线程,那么在你的类申明时必须实现Runnable接口,并且实现接口中的run()方法。

到这里,我想对java有一定基础的朋友一定会使用线程了,下面我们在讲讲java中关于线程的其他方法。

我们在java中编写多线程程序时必须写一个线程类,这个类在前面已经说过既可以是继承自Thread这个抽象类,也可以是实现于Runnable这个接口,当我们通过我们的线程类调用start()方法时,系统就和新增加一个线程来执行run()方法中的代码,run()方法中的代码执行完后线程也就该销毁了。除了运行一个线程,java还提供了很多关于线程的其他方法。

首先是sleep()方法,他的意思是让一个线程睡眠一定的时间,他有两种形式:sleeplong milliseconds sleeplong millisecondsint nanoseconds)。前一个是让一个线程睡眠指定的毫秒数,后一个是让指定的线程睡眠指定的毫秒数在加上指定的纳秒数。但是这里有一点要注意的就是操作系统必须支持毫秒和纳秒的级别,如果操作系统指支持毫秒的级别,那如果你使用第二个方法,那么系统就会将纳秒近似为最接近的毫秒数,然后调用第一个方法,如果系统不支持毫秒级别,那么就会让线程睡眠他能够识别的最精确的时间。

说完了启动,睡眠,就是停止了,java提供了让线程停止的方法stop(),但是这个方法会涉及到一些安全问题,现在java已经不建议使用了。

在一个线程的start()方法调用时到线程的run()方法开始工作的这一段时间是为了线程的执行做准备,比如给线程分配资源等等。在线程运行完后到停止之前也有一段时间是用来做善后工作的。那么在java中规定在start()方法调用之后到善后工作完成之前这段时间认为线程都是活动的。我们可以通过isAlive()方法来判断一个线程是否真正的销毁了。

一个系统的线程越多,系统越复杂,那么调试也就相当困难。在java系统内部,我们生成的每一个线程都有一个唯一的名字。但是名字没有意义,是采用”Thread”后面加一个唯一的ID来表示的。这样对调试人员又是一个大挑战。为了解决这个问题,java提供了给一个线程命名的机制。我们可以通过setName(String name) 方法给一个线程命名,通过getNameString name)方法取得一个线程的名字。除了这两个方法以外。我们还可以在生成一个线程的时候通过构造函数来给一个线程命名。对于通过继承而来的线程,我们使用ThreadString name)来给一个线程命名。如果线程是通过实现Runnable()接口来实现的,那么我们就通过ThreadRunnable targetString name)来给一个线程命名。这样我们在调试多线程的程序时面对一个个有确切名称的线程调试就方便多了。

最后要说一点,一个线程是不能重新启动的。运行完了就完了,不要想着让他在重新运行一次。

通过上面的讲解,大家应该对java 线程的概念有所了解,并且可以自己写一些简单的java 多线程的程序了。

Thread的概念还有很多。由于时间,篇幅等原因,我们就介绍到这里。希望对朋友们有一定的帮助。

 

 

0 0

相关博文

我的热门文章

img
取 消
img