java线程练习题及答案
线程与线程类 1 线程的概念 线程的概念来源于计算机的操作系统的进程的概念。进程是一个程序关于某个数据集 的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。 线程和进程的相似之处在于,线程和运行的程序都是单个顺序控制流。有些教材将线 程称为轻量级进程(light weight process)。线程被看作是轻量级进程是因为它运行在一个程 序的上下文内,并利用分配给程序的资源和环境。 作为单个顺序控制流,线程必须在运行的程序中得到自己运行的资源,如必须有自己 的执行栈和程序计数器。线程内运行的代码只能在该上下文内。因此还有些教程将执行上 下文(cution context)作为线程的同义词。 所有的程序员都熟悉顺序程序的编写,如我们编写的名称排序和求素数的程序就是顺 序程序。顺序程序都有开始、执行序列和结束,在程序执行的任何时刻,只有一个执行点。 线程(thread)则是进程中的一个单个的顺序控制流。单线程的概念很简单,如图 1所示。 多线程(multi-thread)是指在单个的程序内可以同时运行多个不同的线程完成不同的 任务,图 2说明了一个程序中同时有两个线程运行。 图 1 单线程程序示意图 图 2 多线程程序示意图 有些程序中需要多个控制流并行执行。例如, for(int i = 0; i < 100; i++)System.out.println(“Runner A = “ + i); for(int j = 0; j < 100; j++ )System.out.println(“Runner B = “+j); 上面的代码段中,在只支持单线程的语言中,前一个循环不执行完不可能执行第二个 循环。要使两个循环同时执行,需要编写多线程的程序。 很多应用程序是用多线程实现的,如 Hot Java Web 浏览器就是多线程应用的例子。在 Hot Java 浏览器中,你可以一边滚动屏幕,一边下载 Applet 或图像,可以同时播放动画和 声音等。 2 Thread 类和 Runnable 接口 多线程是一个程序中可以有多段代码同时运行,那么这些代码写在哪里,如何创建线 程对象呢? 首先,我们来看 Java 语言实现多线程编程的类和接口。在 java.lang 包中定义了 Runnable 接口和 Thread 类。 一个线程 两个线程Runnable 接口中只定义了一个方法,它的格式为: public abstract void run() 这个方法要由实现了 Runnable 接口的类实现。Runnable 对象称为可运行对象,一个线 程的运行就是执行该对象的 run()方法。 Thread 类实现了 Runnable 接口,因此 Thread 对象也是可运行对象。同时 Thread 类也 是线程类,该类的构造方法如下: public Thread() public Thread(Runnable target) public Thread(String name) public Thread(Runnable target, String name) public Thread(ThreadGroup group, Runnable target) public Thread(ThreadGroup group, String name) public Thread(ThreadGroup group, Runnable target, String name) target 为线程运行的目标对象,即线程调用 start()方法启动后运行那个对象的 run()方法, 该对象的类型为 Runnable,若没有指定目标对象,则以当前类对象为目标对象;name 为线 程名,group 指定线程属于哪个线程组(有关线程组的概念请参考 9.6节) 。 Thread 类的常用方法有: public static Thread currentThread() 返回当前正在执行的线程对象的引用。 public void setName(String name) 设置线程名。 public String getName() 返回线程名。 public static void sleep(long millis) throws InterruptedException public static void sleep(long millis, int nanos) throws InterruptedException 使当前正在执行的线程暂时停止执行指定的毫秒时间。指定时间过后,线程继续执 行。该方法抛出 InterruptedException 异常,必须捕获。 public void run() 线程的线程体。 public void start() 由 JVM 调用线程的 run()方法,启动线程开始执行。 public void setDaemon(boolean on) 设置线程为 Daemon 线程。 public boolean isDaemon() 返回线程是否为 Daemon 线程。 public static void yield() 使当前执行的线程暂停执行,允许其他线程执行。 public ThreadGroup getThreadGroup() 返回该线程所属的线程组对象。 public void interrupt() 中断当前线程。 public boolean isAlive() 返回指定线程是否处于活动状态。线程的创建 本节介绍如何创建和运行线程的两种方法。线程运行的代码就是实现了 Runnable 接口 的类的 run()方法或者是 Thread 类的子类的 run()方法,因此构造线程体就有两种方法: 继承 Thread 类并覆盖它的 run()方法; 实现 Runnable 接口并实现它的 run()方法。继承 Thread 类创建线程 通过继承 Thread 类,并覆盖 run()方法,这时就可以用该类的实例作为线程的目标对 象。下面的程序定义了 SimpleThread 类,它继承了 Thread 类并覆盖了 run()方法。 程序SimpleThread.javapublic class SimpleThread extends Thread{public SimpleThread(String str){super(str); } public void run(){for(int i=0; i<100; i++){System.out.println(getName()+“ = “+ i);try{sleep((int)(Math.random()*100));}catch(InterruptedException e){}} System.out.println(getName()+ “ DONE“); } } __________________________________________