Java多线程
2015-09-02 10:50
519 查看
Java中线程的实现由两种方式:
1. 继承Thread类; 2. 实现Runnable接口
![](http://images2015.cnblogs.com/blog/624262/201509/624262-20150902092513825-574944114.png)
为何启动线程必须通过start方法,而不能通过run方法呢?
原因在于线程的运行需要得到本机操作系统的支持。用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
通过实现runnable接口的方式如下:
![](http://images2015.cnblogs.com/blog/624262/201509/624262-20150902093216591-1785902135.png)
Thread和runnable的子类都实现了runnable接口,之后将runnable 的子类实例放到了Thread类中,这种操作模式和代理模式类似。
如果一个类继承了Thread类,则不适合于多个线程共享资源,而实现了Runnable口的类就可以方便的实现资源的共享。
实现Runnable接口相对于继承Thread类来说,有如下优势:
1. 适合多个相同程序代码的线程去处理同一资源的情况。
2. 可以避免由于Java的单继承特性带来的局限。
3. 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
thread类中的主要方法
1. 继承Thread类; 2. 实现Runnable接口
![](http://images2015.cnblogs.com/blog/624262/201509/624262-20150902092513825-574944114.png)
class MyThread extends Thread{ private String name; public MyThread(String name) { // TODO Auto-generated constructor stub this.name = name; } public void run(){ for(int i=0; i<10; i++){ System.out.println(name+"运行, i="+i); } } } public class ThreadDemo01 { public static void main(String[] args) { // TODO Auto-generated method stub MyThread mt1 = new MyThread("线程A"); MyThread mt2 = new MyThread("线程B"); mt1.start(); //这里启动线程不是调用run方法 mt2.start(); } }
为何启动线程必须通过start方法,而不能通过run方法呢?
原因在于线程的运行需要得到本机操作系统的支持。用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
通过实现runnable接口的方式如下:
![](http://images2015.cnblogs.com/blog/624262/201509/624262-20150902093216591-1785902135.png)
class MyThread implements Runnable{ private String name; public MyThread(String name) { // TODO Auto-generated constructor stub this.name = name; } public void run(){ for(int i=0; i<10; i++){ System.out.println(name+"运行, i="+i); } } } public class ThreadDemo01 { public static void main(String[] args) { // TODO Auto-generated method stub MyThread mt1 = new MyThread("线程A"); MyThread mt2 = new MyThread("线程B"); Thread t1 = new Thread(mt1); //这里和继承Thread不太一样 Thread t2 = new Thread(mt2); t1.start(); // t2.start(); } }
Thread和runnable的子类都实现了runnable接口,之后将runnable 的子类实例放到了Thread类中,这种操作模式和代理模式类似。
如果一个类继承了Thread类,则不适合于多个线程共享资源,而实现了Runnable口的类就可以方便的实现资源的共享。
class Thread1 extends Thread{ private int ticket = 5; public void run(){ for(int i=0; i<100; i++){ if(ticket>0){ System.out.println("买票:ticket = "+ticket--); } } } } public class ThreadDemo04 { public static void main(String[] args) { // TODO Auto-generated method stub Thread1 t1 = new Thread1(); Thread1 t2 = new Thread1(); Thread1 t3 = new Thread1(); t1.start(); t2.start(); t3.start(); } }
class Thread2 implements Runnable{ private int ticket = 5; public void run(){ for(int i=0; i<100; i++){ if(ticket>0){ System.out.println("买票: ticket = "+ticket--); } } } } public class RunnableDemo02 { public static void main(String[] args) { // TODO Auto-generated method stub Thread2 t1 = new Thread2(); new Thread(t1).start(); new Thread(t1).start(); new Thread(t1).start(); } }
实现Runnable接口相对于继承Thread类来说,有如下优势:
1. 适合多个相同程序代码的线程去处理同一资源的情况。
2. 可以避免由于Java的单继承特性带来的局限。
3. 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
thread类中的主要方法
![](http://images2015.cnblogs.com/blog/624262/201509/624262-20150902104900091-1582004184.png)
相关文章推荐
- Struts2 part 1:快速入门
- java获取整数小数
- 学习日志---二叉树概念与遍历(递归)
- Struts2 二、为Action的参数注入值
- Struts2 二、为Action的参数注入值
- 怎么获取java项目中的文件
- Java____利用自带包用MD5加密__关于图片上传的思考
- 解决springmvc+mybatis+mysql中文乱码问题
- Spring Boot热启动
- 黑马程序员——JDK5.0新特性(泛型)
- BigDecimal.setScale 处理java小数点
- js 中去掉字符串两边的空的方法(即java中的trim()方法)
- eclipse一直停留在Loading workbench界面上的处理办法
- Java简单实现SpringMVC+MyBatis分页插件
- Eclipse快捷键使用大全
- Ubuntu 14.04 桌面版 安装 JDK 7.0
- java中的nextline()
- Java目录处理及遍历解压
- springmvc 乱码问题
- java excel转dbf