博文

Java 程序中的多线程 <2>(2006-05-11 15:46:00)

摘要:Neel V. Kumar

Terway.com 软件工程师

2000 年 3 月




内容:


 为什么会排队等待?
 实现线程
 高级多线程
 不提倡使用的方法
 调试线程
 调试若干个线程
 限制线程优先级
 小结
 参考资料
 作者简介






在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应该能够编写简单的多线程程序。




为什么会排队等待?

下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程,控制在这四个任务之间线性地移动。此外,因为所需的资源 — 打印机、磁盘、数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含明显的等待时间。因此,程序在访问数据库之前必须等待打印机完成打印文件的任务,等等。如果您正在等待程序的完成,则这是对计算资源和您的时间的一种拙劣使用。改进此程序的一种方法是使它成为多线程的。


四项不相关的任务

class myclass {
static public void main(String args[]) {
print_a_file();
manipulate_another_file();
access_database();
draw_picture_on_screen();
}
}

在本例中,每项任务在开始之前必须等待前一项任务完成,即使所涉及的任务毫不相关也是这样。但是,在现实生活中,我们经常使用多线程模型。我......

阅读全文(4142) | 评论:0

Java 程序中的多线程 <1>(2006-05-11 15:45:00)

摘要:Java 程序中的多线程

看一看开发和使用线程是多么容易

Neel V. Kumar

Terway.com 软件工程师
在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应该能够编写简单的多线程程序。 为什么会排队等待?

下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程,控制在这四个任务之间线性地移动。此外,因为所需的资源 — 打印机、磁盘、数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含明显的等待时间。因此,程序在访问数据库之前必须等待打印机完成打印文件的任务,等等。如果您正在等待程序的完成,则这是对计算资源和您的时间的一种拙劣使用。改进此程序的一种方法是使它成为多线程的。


  四项不相关的任务

class myclass {
static public void main(String args[]) {
print_a_file();
manipulate_another_file();
access_database();
draw_picture_on_screen();
}
}

  在本例中,每项任务在开始之前必须等待前一项任务完成,即使所涉及的任务毫不相关也是这样。但是,在现实生活中,我们经常使用多线程模型。我们在处理某些任务的同时也可以让孩子、配偶和父母完成别的任务。例如,我在写信的同时可能打发我的儿子去邮局买邮票。用软件术语来说,这称为多个控制(或执行)线程。

  可以用两种不同的方法来获得多个控制线程:

 
多个进程
在大多数操作系统中都可以创建多个进程。当一个程序启动时,它可以为即将开始的每项任务创建一个进程,并允许它们同时运行。当一个程序因等待网络访问或用户输入而被阻塞时,另一个程序还可以运行,这样就增加了资源......

阅读全文(4100) | 评论:0

线程基础---wait(),notify的应用一例(2006-05-11 15:42:00)

摘要:线程基础---wait(),notify的应用一例
作者:jdeveloper

本例子实现了两个线程,每个线程输出1到100的数字。
第一个线程输出1-10,停止,通知第二个线程 输出1-10 第二个线程停止 通知第一个线程 输出11-20 ...
实现的要点是
在Java中,每个对象都有个对象锁标志(Object lock flag)与之想关联,当一个线程A调用对象的一段synchronized代码时,
它首先要获取与这个对象关联的对象锁标志,然后执行相应的代码,执行结束后,把这个对象锁标志返回给对象;因此,在线程A执行
synchronized代码期间,如果另一个线程B也要执行同一对象的一段synchronized代码时(不一定与线程A执行的相同),它将
要等到线程A执行完后,才能继续....

如何利用wait() notify() notifyAll()?

在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁标志,进入等待状态,并且可以调用notify()或者
notifyAll()方法通知正在等待的其他线程。notify()通知等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有线程。





package jdeveloper.study;

/**
* Title: Jdeveloper's Java Projdect
* Description: n/a
* Copyright: Copyright (c) 2001
* Company: soho http://www.ChinaJavaWorld.com
* @author jdeveloper@21cn.com
* @version 1.0
*/
import java.lang.Runnable;
import java.lang.Thread;

public class DemoThread impleme......

阅读全文(4539) | 评论:0

彻底明白Java的多线程-实现多线程及线程的同步(2006-05-11 15:41:00)

摘要:一. 实现多线程

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......

阅读全文(4042) | 评论:0

Java多线程程序设计入门 (2006-05-11 15:40:00)

摘要:在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。 随着Internet的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时CPU资源被白白的闲置起来。如果在后台程序中能够同时处理多个任务,该多好啊!应Internet技术而生的Java语言解决了这个问题,多线程程序是Java语言的一个很重要的特点。在一个Java程序中,我们可以同时并行运行多个相对独立的线程,例如,我们如果创建一个线程来进行数据输入输出,而创建另一个线程在后台进行其它的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然在运行。多线程程序设计大大提高了程序执行效率和处理能力。


  线程的创建


  我们知道Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。下面是一个创建启动一个线程的语句:


  Thread thread1=new Thread(); file://声明一个对象实例,即创建一个线程;


  Thread1.run(); file://用Thread类中的run()方法启动线程;


  从这个例子,我们可以通过Thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而Thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。Java中通常有两种方式定义run()方法:


  通过定义一个Thread类的子类,在该子类中重写run()方法。Thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。


  通过Runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用......

阅读全文(4020) | 评论:0