7.2 Java线程例子
7.2.1 显式定义线程
在我们的单线程应用程序里,我们并没有看见线程,因为Java能自动创建和控制你的线程。如果你使用了理解Java语言的浏览器,你就已经看到使用多线程的Java程序了。你也许注意到两个小程序可以同时运行,或在你移动滚动条时小程序继续执行。这并不是表明小程序是多线程的,但说明这个浏览器是多线程的。多线程应用程序(或applet)可以 使 用 好几个执行上下文来完成它们的工作。多线程利用了很多任务包含单独的可分离的子任务 的特点。每一个线程完成一个子任务。
但是,每一个线程完成子任务时还是顺序执行的。一个多线程程序允许各个线程尽快执行完它们。这种特点会有更好的实时输入反应。
7.2.2 多线程例子
下面这个例子创建了三个单独的线程,它们分别打印自己的“Hello World":
//Define our simple threads.They will pause for a short time
//and then print out their names and delay times
public class TestThread extends Thread {
private String whoami; //定义其属性
private int delay;
//Our constructor to store the name (whoami)
//and time to sleep (delay)
public TestThread(String s, int d) { //定义了一个线程的构造函数
whoami = s;
delay = d;
}
//Run - the thread method similar to main()
//When run is finished, the thread dies.
//Run is called from the start() method of Thread
public void run() { //运行线程
//Try to sleep for the specified time
try {
sleep(delay); //让线程进行睡眠
}
catch(InterruptedException e) {
}
//Now print out our name
System.out.println("Hello World!"+whoami+""+delay);
}
}
/** * Multimtest. A simple multithread thest program */
public static void main(String[] args) {
TestThread t1,t2,t3;
//Create our test threads
t1 = new TestThread("Thread1",(int)(Math.readom()*2000)); //实例化线程
t2 = new TestThread("Thread2",(int)(Math.readom()*2000));
t3 = new TestThread("Thread3",(int)(Math.readom()*2000));
//Start each of the threads
t1.start(); //启动线程
t2.start();
t3.start();
}
}
7.2.3 启动一个线程
程序启动时总是调用main()函数,因此main()是我们创建和启动线程的地方:
t1 = new TestThread("Thread1", (int)(Math.readom()*2000));
这一行创建了一个新的线程。后面的两个参数传递了线程的名称和线程在打印信息前的延 时时间。因为我们直接控制线程,我们必须直接启动它:
t1.start();
7.2.4 操作线程
如果创建线程正常,t1应包含一个有效的执行线程。我们在线程的run()函数里控制线程。 当进 入run()函数,我们便可执行里面的任何程序。run()好象main()一样。 当执行完,这个线程也就结束了。在这个例子里,我们试着延迟一个随机的时间(通过参数传递);
sleep(delay);
sleep()函数只是简单地告诉线程休息多少个毫秒时间。如果你想推迟一个线程的执行, 应使用sleep()函数。 当线程睡眠是sleep()并不占用系统资源。其它线程可继续工作。当延迟时间完毕,它将打印"Hello World"和线程名称及延迟时间。
7.2.5 暂停一个线程
我们经常需要挂起一个线程而不指定多少时间。例如,如果你创建了一个含有动画线程的小程序。也许你让用户暂停动画至到他们想恢复为止。你并不想将动画线程仍调,但想让它停止。象这种类似的线程你可用suspend()函数来控制:
t1.suspend();
这个函数并不永久地停止了线程,你还可用resume()函数重新激活线程:
t1.resume();
7.2.6 停止一个线程
线程的最后一个控制是停止函数stop()。 我们用它来停止线程的执行:
t1.stop();
注意:这并没有消灭这个线程,但它停止了线程的执行。并且这个线程不能用t1.start()重新启动。在我们的例子里,我们从来不用显式地停止一个线程。我们只简单地让它执行完而已。很多复杂的线程例子将需要我们控制每一个线程。在这种情况下会使用到stop()函数。如果需要,你可以测试你的线程是否被激活。一个线程已经启动而且没有停止被认为是激活的。t1.isAlive() 如果t1是激活的,这个函数将返回true.
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。