java分别用Thread方法和Runable方法实现异步
2014-05-26 16:57
323 查看
首先,对进程和线程的概念做一个简单的介绍,点击打开链接,这篇博客用一个形象的比喻对这两个概念做了一个解释,对初学者很有帮助。
简而言之:进程是程序的一次执行,进程在执行过程中拥有独立的存储单元
线程是CPU调度的基本单位,有时称为迷你进程,同一个进程中的多个线程共享进程的所有资源。
JAVA中多线程的实现:
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限
我们定义两个类,分别用Thread方法和Runable方法实现异步类:
1.通过run()方法启动thread1,并不能实现交互运行
因为run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
2.通过start()方法启动线程thread1:
运行结果:
通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法
run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)。
3.启动thread2
运行结果:
可以看到,运行结果中出现了两次num=10,甚至num=-1的情况,原因是因为代码中线程不同步,第一个线程运行num--的时候第二个第三个线程可能也在运行num--,在多个线程的run的代码块中调用同一个变量,可能会造成线程不安全。多个线程调用同一个变量可以对变量加锁,一般用Synchronize这个关键词。
把thread2中的run方法,改成public synchronized void run() 即可。
简而言之:进程是程序的一次执行,进程在执行过程中拥有独立的存储单元
线程是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() 即可。
相关文章推荐
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable
- java两种启动线程方法根本不同,Thread继承和实现Runable接口
- Java Thread Stop方法以及替换实现
- java创建多线程的两种方法(继承Thread类/实现Runnable接口)
- java多线程Thread的实现方法、中断机制、生命周期、守护进程等
- Java 中多线程的实现方法之Thread和Runnable
- Java中Thread和Runnable方法实现多线程差异性分析
- Java:多线程,分别用Thread、Runnable、Callable实现线程
- [Java多线程]-Thread和Runable源码解析之基本方法的运用实例
- JAVA知识回顾-5(Interface与abstract类的介绍、Static class与not static class的区别、java多态的实现原理、Thread与Runable)
- Java Thread Stop方法以及替换实现
- Java Thread Stop方法以及替换实现
- Java中两种多线程实现方法:Thread类和Runnable接口的联系与区别
- 理解同步与异步,及java中实现同步机制的方法
- java Thread学习-Thread的实现方法 继承Thread,实现Runnable 接口
- JAVA 两种方法实现多线程(继承Thread和实现Runnable接口)
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
- JAVA 线程的两种基本实现方法(继承Thread类和实现Runnable接口)
- Java学习 - Thread的Stop方法以及替换实现
- Java传统多线程的实现有两种方法,继承Thread类或者实现Runnable即可.线程启动时调用start()方法.