您的位置:首页 > 编程语言 > Java开发

java分别用Thread方法和Runable方法实现异步

2014-05-26 16:57 323 查看
首先,对进程和线程的概念做一个简单的介绍,点击打开链接,这篇博客用一个形象的比喻对这两个概念做了一个解释,对初学者很有帮助。

简而言之:进程是程序的一次执行,进程在执行过程中拥有独立的存储单元

线程是CPU调度的基本单位,有时称为迷你进程,同一个进程中的多个线程共享进程的所有资源。

JAVA中多线程的实现:

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限

我们定义两个类,分别用Thread方法和Runable方法实现异步类:

<pre name="code" class="java">class Thread1 extends Thread{
private String threadName;
private int num=10;
public Thread1(String threadName){
this.threadName=threadName;
}
public void run() {
while(num>0){
System.out.println(this.threadName+": "+num);
num--;
}
}

}

class Thread2 implements Runnable{
private int num=10;
@Override
public void run() {
// TODO Auto-generated method stub
while(num>0){
System.out.println(Thread.currentThread().getName()+": "+num);
num--;
}
}

}



1.通过run()方法启动thread1,并不能实现交互运行
public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 mt1=new Thread1("T1");
Thread1 mt2=new Thread1("T2");
mt1.run();
mt2.run();
}
}
以下是运行结果:



因为run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

2.通过start()方法启动线程thread1:

public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 mt1=new Thread1("T1");
Thread1 mt2=new Thread1("T2");
mt1.start();
mt2.start();
}
}


运行结果:



通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法
run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)。

3.启动thread2

<pre name="code" class="java">public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread2 mt=new Thread2();
Thread td1=new Thread(mt, "T1");
Thread td2=new Thread(mt,"T2");
Thread td3=new Thread(mt,"T3");
td1.start();
td2.start();
td3.start();
}
}



运行结果:



可以看到,运行结果中出现了两次num=10,甚至num=-1的情况,原因是因为代码中线程不同步,第一个线程运行num--的时候第二个第三个线程可能也在运行num--,在多个线程的run的代码块中调用同一个变量,可能会造成线程不安全。多个线程调用同一个变量可以对变量加锁,一般用Synchronize这个关键词。

把thread2中的run方法,改成public synchronized void run() 即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: