Java多线程技术及案例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java多线程技术及案例
进程和线程:
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
Java中多线程的多种实现方式
Java中有多种多线程实现方法,主要是继承ng.Thread类的方法和
ng.Runnable接口的方法。
继承Thread类
Thread是ng包中的一个类,从这个类中实例化的对象代表线程,启动一个新线程需要建立一个Thread实例。
使用Thread类启动新的线程的步骤如下:
1.实例化Thread对象
2.调用start()方法启动线程
构造方法:
public Thread(String threadName);
public Thread();
例程:
publicclass Thread1extends Thread{//定义一个类继承Thread privateint count=1000;
publicvoid run(){//重写run方法
while(true){
System.out.print(count+" ");
if(--count==0){
return;
}
}
}
publicstaticvoid main(String[] args){
Thread1 th1=new Thread1();//实例化继承了Thread的类 Thread1 th2=new Thread1();
th1.start();//调用start()方法,
th2.start();
for(int i=0;i<1000;i++){
System.out.print("A ");
}
}
}
以上例子中,Thread1继承了Thread并重写了run()方法,在主程序中,首先实例化Thread1对象,然后调用start()方法运行run()方法。另外主程序本身是一个线程,再调用两个新线程,根据打印数据,可以看到数字和字母交替输出,而且两组数字序列也穿插出现,说明三个线程都在同步运行。
Java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。
另外,在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM就是在操作系统中启动了一个进程。
Runnable接口
实现Runnable接口程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。
使用Runable接口启动新的线程的步骤如下:
1.建立实现Runnable接口的类
2.使用参数为Runnable对象的构造方法创建Thread实例
3.调用start()方法启动线程
构造方法:
public Thread(Runnable r);
public Thread(Runnable r,String name);
例程:
class Thread2implements Runnable{
private String name;
public Thread2(String name) {
=name;
}
@Override
publicvoid run() {
for (int i = 0; i <5; i++) {
System.out.println(name + "运行 : " + i);
}
}
}
publicclass Main {
publicstaticvoid main(String[] args) {
new Thread(new Thread2("C")).start();
//new Thread2("C")创建的是Runnable对象,new Thread(new Threa d("C"))是实例化与Runnable对象相关联的Thread对象
new Thread(new Thread2("D")).start();
}
}
上例主程序中,new Thread2(“C”)创建的是Runnable对象,new Thread(new Thread(“C”))是实例化与Runnable对象相关联的Thread对象。
Thread2类通过实现Runnable接口,使得该类有了多线程类的特征。run方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。
Thread和Runnable的区别与联系
联系:
我们可以发现,无论是Thread还是Runnable方法,都有run方法和start方法,而且Runnable方法使用首先需要通过构造方法把Runnable对象和Thread对象的联结,这是因为实际上,Thread也是实现了Runnable接口的类。
run是Runnable接口的方法,包含着该线程的程序代码。
start是Thread类的方法,它调用Thread对象所实现的Runnable接口中的run方法代码块。
所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread 类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。
区别:
作为编程语言这样的人造物,与其问区别不如问为什么存在。为什么并存继承Thread类和实现Runnable接口两种多线程方法?
这主要是因为接口的独特优势。