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() 即可。
- java分别用Thread方法和Runable方法实现异步
- java线程继承Thread方法和实现Runable方法区别
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable
- java两种启动线程方法根本不同,Thread继承和实现Runable接口
- 用Thread和Runable同样实现资源共享
- Java的类可以同时继承thread和实现runable
- Java中Thread和runable的区别
- Runable和thread的区别(多线程必须用Runable)
- Runable和thread的区别(多线程必须用Runable)
- Runable和thread的区别(多线程必须用Runable)
- Runable和thread的区别(多线程必须用Runable)
- Runable和thread的区别(多线程必须用Runable)
- java Thread与Runable
- Thread和runable
- Thread 和 Runable 区别
- Runable和Thread
- thread 和runable 区别
- 多线程两种实现区别-继承Thread和实现Runable
- 【C++】变量(七) 参量
- string 转stream和stream转string
- ace nonblock
- eYdoae谑侍YBHOC
- linux下安装mysql
- java分别用Thread方法和Runable方法实现异步
- 转载+自练(莫喷)如何在cocos2d 2.1.4里面使用动画和Texture Packer
- App.Config详解及读写操作
- Python笔记——从shell中退出python命令
- Cocos2D-x权威指南:坐标系简介
- ArcGIS 10 新特性之栅格和影像数据
- android内存泄露
- App.Config详解及读写操作
- x264使用示例