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

来源:互联网 发布:linux c 服务器开发 编辑:程序博客网 时间:2024/06/06 00:20

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

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

                 线程是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;@Overridepublic void run() {// TODO Auto-generated method stubwhile(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() 即可。




0 0
原创粉丝点击