图13-16 线程示意图
上图中,圆圈仍然代表一个进程,但我们在这个进程中有两个不同的代码段,它们共享进程的地址空间、寄存器……,一个负责接收远方的信息,另一个负责打印出来!
这样,如果遇到打印机忙的时候,也只会将负责打印的那个部分“阻塞”,接收信息还是照常运行的。
这两个不同的代码段,就是线程,也称之为轻量进程。我们发现在一个程序中使用多个线程将会使我们的程序更Power!
注意:
线程的实现是要操作系统支持的,要写多线程的程序则需要编程语言的支持。Window操作系统是支持多线程的。因此我们只要使用能够支持多线程的编程语言就可以写多线程的程序。Java就是一种能够支持多线程编程的程序语言。
多线程的程序设计是比较高级的内容,而本书是一本Java的入门书籍,因此我们只对其做一个简单的介绍,使得大家通过本书的学习具备自学编写多线程的Java程序的能力。
在Java语言中,可以采用两种方法来实现多线程:
1.继承Thread类
也就是说,创建一个Thread类的子类,如:
public class testThread extends Thread
|
由于这种方法显得较为死板,所以我们一般很少使用这种方法。
2.使用Runnable接口
正如前面所说的,通常我们希望我们的类扩展其它类,而在Java中又不支持多重继承(也就是同时继承A、B两个类)。我们必须解决这个问题:
一些提示:
例如,我们想在一个Java的Applet程序中使用多线程,但我们要编写Applet
程序就必须继承java的Applet或Japplet类,那我们就无法再继承Thread类。因 为Java是不允许一个类同时继承两个类的。
Java提供了一个Runnable接口来实现这个问题。
1) 使用Runnable接口,首先在类的定义后面加上implements Runnable,如:
public class testThread extends Applet implements Runnable
|
2) 然后,再重写定义一个run()方法,定义线程要做的事情。
实例说明
下面,我们就来编写一个多线程的程序。首先创建两个源程序:testThread.java和Threader.java。
源程序:testThread.java
import java.awt.*;
import java.applet.*;
import Threader;
public class testThread extends Applet implements Runnable
{
Threader theRacers[];
static int racerCount = 3;
Thread theThreads[];
Thread thisThread;
static boolean inApplet=true;
int numberofThreadsAtStart;
public void init()
{
numberofThreadsAtStart = Thread.activeCount();
setLayout(new GridLayout(racerCount,1));
theRacers = new Threader [racerCount];
theThreads = new Thread[racerCount];
for (int x=0;xnumberofThreadsAtStart+2)
{
try
{
thisThread.sleep(100);
}
catch (InterruptedException e)
{
System.out.println("thisThread was interrupted");
}
}
if (inApplet)
{
stop();
destroy();
}
else
System.exit(0);
}
public static void main (String argv[])
{
inApplet=false;
if (argv.length>0)
racerCount = Integer.parseInt(argv[0]);
Frame theFrame = new Frame("The Great Thread Race");
testThread theRace = new testThread();
theFrame.setSize(400,200);
theFrame.add ("Center",theRace);
theFrame.show();
theRace.init();
theFrame.pack();
theRace.start();
}
}
|
源程序:Threader.java
import java.awt.*;
public class Threader extends Canvas implements Runnable
{
int myPosition =0;
String myName;
int numberofSteps=600;
boolean keepRunning = true;
public Threader (String inName)
{
myName=new String (inName);
}
public synchronized void paint(Graphics g)
{
g.setColor (Color.black);
g.drawLine 0,getSize().height/2,
getSize().width,getSize().height/2);
g.setColor (Color.yellow);
g.fillOval((myPosition*getSize().width/numberofSteps),0,
15,getSize().height);
}
public void stop()
{
keepRunning = false;
}
public void run()
{
while ((myPosition
|
输入完成以后,执行以下命令编译: