Java多线程编程初步
2008-01-05 20:07:53 来源:WEB开发网核心提示:什么是多线程编程多线程编程技术是java语言的重要特点,多线程编程的含义是将程序任务分成几个并行的子任务,Java多线程编程初步,非凡是在网络编程中,你会发现很多功能是可以并发执行的,该线程就一直存在于该线程组中直至线程终止,不能在中途改变线程所属的线程组,
什么是多线程编程
多线程编程技术是java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。非凡是在网络编程中,你会发现很多功能是可以并发执行的。 比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。
多线程是与单线程比较而言的,普通的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。
Java中的线程类
要学会Java中的多线程编程,就得知道如何实现支持多线程的类。Java中实现多线程的类有两种方法:
1.扩展java.lang.Thread类,用它覆盖Thread类的run方法。
2.生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。
Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了扩展Thread类,如PRintThread.java。
下面我们将通过实例来介绍如何使用这两种方法编写自己的多线程应用程序。
创建java.lang.Thread类的子类
Thread类最重要的方法是run方法。run方法是新线程执行的方法,因此生成java.lang.Thread的子类时,必须有相应的run方法。
//PrintThread.java
public class PrintThread extends Thread//继续Tread类
private int count=0 //定义一个count变量用于统计打印的次数并共享变量
public static void mainString args//main方法开始
PrintThread p=new PrintThread//创建一个线程实例
p.start//执行线程
for{;;}//主线程main方法执行一个循环,for执行一个死循环
count++
System.out.printcount+″:Main\n″//主线程中打印count +“main”变量的值,并换行
public void run//线程类必须有的run()方法
for{;;}
count++
System.out.printcount+″:Thread\n″
上面这段程序便是继续java.lang.Tread并覆盖run的方法。用Java 虚拟机启动程序时,这个程序会先生成一个线程并调用程序主类的main方法。这个程序中的main方法生成新线程,连接打印“Thread”。在启动线程之后,主线程继续打印“Main”。
编译并执行这个程序,然后立即按“Ctrl+C”键中断程序,你会看到上面所述的两个线程不断打印出:XXX:main…..XXX:Thread…. XXX代表的是数字,也就是上面count的值。在笔者的机器上,不同时刻这两个线程打印的次数不一样,先打印20个main(也就是先执行20次主线程)再打印出50次Thread,然后再打印main……
提示:为了便于查看该程序的执行结果,你可以将执行结果导入一个文本文件,然后打开这个文件查看各线程执行的情况。如运行:
javac PrintThread.java
Java PrintThread>1.txt
第一个命令javac PrintThread.java是编译java程序,第二个是执行该程序并将结果导入1.txt文件。这样,打开这个文件,你就可以看见具体的结果了(注重:程序的执行时间不能太长,不然生成的1.txt文件会很庞大)。当然你可以直接执行命令:java PrintThread。 实现java.lang.Runnable接口
运行线程的另一种方法是实现Runnable接口,然后生成运行这个类的线程即可。Runnable接口是定义在java.lang包中的一个接口,其中只提供了一个抽象的run声明。
下面我们来看看如何实现Runnable接口,而不是扩展Thread类。
//PrintRunnableThread.java 实现Runnable接口
public class PrintRunnableThread implements Runnable
public static void mainString args
Thread t=new Threadnew PrintRun
nableThread
//t.setPriorityThread.MAX_PRIORI
TY//设置最大优先级
t.start//线程开始
for{;;}//不停地打印字符M,代表主线程main
System.out.println″M″
public void run
for{;;}//不停地打印字符T,代表线程thread
System.out.println″T″
运行本程序,你会发现执行结果和PrintThread.java的执行结果很类似,甚至你可以再添加一个变量,并打印出相似的线程执行结果。
提示:与前例不同的是,假如去掉t.setPriorityThread.MAX_PRIORITY语句前的注释符,就将线程设置成最大优先级,执行结果就大不一样了。
线程组ThreadGroup
java.lang.ThreadGroup类表示一组线程(可能包含其它ThreadGroup),用来实现按照特定功能对线程进行集中式分组治理。用户创建的每个线程均属于某线程组,这个线程组可以在线程创建时指定,也可以不指定线程组以使该线程处于默认的线程组之中。但是,一旦线程加入某线程组,该线程就一直存在于该线程组中直至线程终止,不能在中途改变线程所属的线程组。
下面的代码演示了如何操作和使用ThreadGroup。
多线程编程技术是java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。非凡是在网络编程中,你会发现很多功能是可以并发执行的。 比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。
多线程是与单线程比较而言的,普通的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。
Java中的线程类
要学会Java中的多线程编程,就得知道如何实现支持多线程的类。Java中实现多线程的类有两种方法:
1.扩展java.lang.Thread类,用它覆盖Thread类的run方法。
2.生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。
Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了扩展Thread类,如PRintThread.java。
下面我们将通过实例来介绍如何使用这两种方法编写自己的多线程应用程序。
创建java.lang.Thread类的子类
Thread类最重要的方法是run方法。run方法是新线程执行的方法,因此生成java.lang.Thread的子类时,必须有相应的run方法。
//PrintThread.java
public class PrintThread extends Thread//继续Tread类
private int count=0 //定义一个count变量用于统计打印的次数并共享变量
public static void mainString args//main方法开始
PrintThread p=new PrintThread//创建一个线程实例
p.start//执行线程
for{;;}//主线程main方法执行一个循环,for执行一个死循环
count++
System.out.printcount+″:Main\n″//主线程中打印count +“main”变量的值,并换行
public void run//线程类必须有的run()方法
for{;;}
count++
System.out.printcount+″:Thread\n″
上面这段程序便是继续java.lang.Tread并覆盖run的方法。用Java 虚拟机启动程序时,这个程序会先生成一个线程并调用程序主类的main方法。这个程序中的main方法生成新线程,连接打印“Thread”。在启动线程之后,主线程继续打印“Main”。
编译并执行这个程序,然后立即按“Ctrl+C”键中断程序,你会看到上面所述的两个线程不断打印出:XXX:main…..XXX:Thread…. XXX代表的是数字,也就是上面count的值。在笔者的机器上,不同时刻这两个线程打印的次数不一样,先打印20个main(也就是先执行20次主线程)再打印出50次Thread,然后再打印main……
提示:为了便于查看该程序的执行结果,你可以将执行结果导入一个文本文件,然后打开这个文件查看各线程执行的情况。如运行:
javac PrintThread.java
Java PrintThread>1.txt
第一个命令javac PrintThread.java是编译java程序,第二个是执行该程序并将结果导入1.txt文件。这样,打开这个文件,你就可以看见具体的结果了(注重:程序的执行时间不能太长,不然生成的1.txt文件会很庞大)。当然你可以直接执行命令:java PrintThread。 实现java.lang.Runnable接口
运行线程的另一种方法是实现Runnable接口,然后生成运行这个类的线程即可。Runnable接口是定义在java.lang包中的一个接口,其中只提供了一个抽象的run声明。
下面我们来看看如何实现Runnable接口,而不是扩展Thread类。
//PrintRunnableThread.java 实现Runnable接口
public class PrintRunnableThread implements Runnable
public static void mainString args
Thread t=new Threadnew PrintRun
nableThread
//t.setPriorityThread.MAX_PRIORI
TY//设置最大优先级
t.start//线程开始
for{;;}//不停地打印字符M,代表主线程main
System.out.println″M″
public void run
for{;;}//不停地打印字符T,代表线程thread
System.out.println″T″
运行本程序,你会发现执行结果和PrintThread.java的执行结果很类似,甚至你可以再添加一个变量,并打印出相似的线程执行结果。
提示:与前例不同的是,假如去掉t.setPriorityThread.MAX_PRIORITY语句前的注释符,就将线程设置成最大优先级,执行结果就大不一样了。
线程组ThreadGroup
java.lang.ThreadGroup类表示一组线程(可能包含其它ThreadGroup),用来实现按照特定功能对线程进行集中式分组治理。用户创建的每个线程均属于某线程组,这个线程组可以在线程创建时指定,也可以不指定线程组以使该线程处于默认的线程组之中。但是,一旦线程加入某线程组,该线程就一直存在于该线程组中直至线程终止,不能在中途改变线程所属的线程组。
下面的代码演示了如何操作和使用ThreadGroup。
更多精彩
赞助商链接