在java中创建和运行简单的线程

来源:百度文库 编辑:神马文学网 时间:2024/04/28 19:50:11
如果一个类需要具有多线程功能,他必须扩展位于java.lang程序包中的Thread类并覆盖他的run方法。需要以一个独立的线程形式运行的代码就放在这个run方法中。我们通过调用start方法来执行这个方法。
下面举例来说明一个java相成的最基本形式:
///////ThreadBasic.java
public class HelloThread extends Thread{
String message;
HelloThread(String message){
this.message=message;
}
public void run(){
/*int sleeptime=(int)(Math.random()*3000);          ///A
try{                                              //B
sleep(sleeptime);                             ///C
}catch(InterruptedException e){}                  ///D
*/
System.out.println(message);
}
public static void main(String args[]) throws InterruptedException{
HelloThread hello1=new HelloThread("Good");
HelloThread hello2=new HelloThread("morning");
HelloThread hello3=new HelloThread("to");
hello1.start();
hello2.start();
hello3.start();
/*hello1.join();                             ////H
hello2.join();                                ///I
hello3.join();                               ////J
*/
try{                                           ///////E
sleep(1000);                         ///////F
}catch(InterruptedException e){  }          ///G
System.out.println("you!");
}
}
说明:1、该类中run方法完成的任务是打印出作为参数传递给这个类的构造函数的那条信息。这个程序的整体目标是在终端上打印出下面的字符串:goog morning to you
2、这个字符串的前三个单词将有main函数所创建的3个子线程打印出来,最后的一个you则由main函数的父线程打印
3、从理论上说,我们无法保证这个字符串肯定将以上述顺序打印出来。由于这3个线程以及他们所在的进程将并发执行,因此这些单词可能以混乱的顺序打印出来。
4、为了说明3、我们注释掉E行至G行代码,在大多数情况下,you这个单词将出现在比较靠前的为止。同时,如果我们没有注释掉A行至D行原来被注释掉的代码块,在每个线程中引入随即的睡眠时间,这些单词肯定会以一个混乱的顺序打印出来。引入到每个线程的睡眠时间大致对应于一个线程在执行输出代码前可能进行的一些后台活动。
5、只要是一个线程是通过调用HelloThread类的构造函数而创建,这个线程便被认为处于born状态。当我们在这个线程上调用start方法时,他就切换到runnable状态,并等待调度以便执行。在考虑到优先级的因素(通过在线程上调用setPriority来设置),操作系统的调度程序为每个线程分配一个固定的时间间隔,使得他们得以由处理器执行。 这个固定的时间间隔称为quantum。为不同的线程分配以quantum计的时间的做法称为时间片(timeslicing)
6、join方法可以实现对线程之间的竞争条件进行限制。在另一个线程上调用join方法的线程将暂停他自己的执行,直至那个线程执行完。代码中的H-J行可以保证you最后输出。但是不能保证其他三个单词的输出顺序