注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

java 多线程(二) Thread和Runnable  

2015-07-03 15:26:01|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
搞android的都知道在用线程的时候,经常遇到Thread和Runnable,有时用Thread,有时用Runnable,有时一起用,这两个有啥区别

一、Thread
class extends Thread{

public void run(){
// other code…
}
属性1
属性2
方法
 
}

//使用
public static void main(String[] args) {
      A a = new A();
      A a1 = new A();     
      a.start();
      a1.start();
}

二、Runnable
class implements Runnable{

public void run(){
// other code…
}
属性1
属性2
方法
 
}

//使用
public static void main(String[] args) {
       A a = new A();
       Thread demo = new Thread(a);
       Thread demo1 = new Thread(a);       
       demo.start();
       demo1.start();
    }

可以看到在写线程类上,一个是extend Thread,一个是implements Runnable
在使用方式上,Thread可直接new Thread.start();   Runnable需要借助Thread(Runnable).start();

查看源码,其实Thread也是实现了Runnable接口
class Thread implements Runnable {
    //…
    public void run() {
        if (target != null) {
           target.run();
        }
     }
}
Thread中的run()调用的也是Runnable的run()方法。貌似这种方式叫代理模式

下面从代码上看下这两个的区别
一、Thread
class hello extends Thread {
    public void run() {
        for (int i = 0; i < 7; i++) {
            if (count > 0) {
count--;
                System.out.println("count= " + count);
            }
        }
    }
 
    public static void main(String[] args) {
        hello h1 = new hello();
        hello h2 = new hello();
        hello h3 = new hello();
        h1.start();
        h2.start();
        h3.start();
    }
 
    private int count = 5;
}

【运行结果】:

count= 5

count= 4

count= 3

count= 2

count= 1

count= 5

count= 4

count= 3

count= 2

count= 1

count= 5

count= 4

count= 3

count= 2

count= 1


二、Runnable
class MyRunnable implements Runnable{
 
    private int ticket = 5;  //5张票
 
    public void run() {
        for (int i=0; i<=20; i++) {
            if (this.ticket > 0) {
this.ticket--;
                System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket);
            }
        }
    }
}
public class lzwCode {
     
    public static void main(String [] args) {
        MyRunnable my = new MyRunnable();
        new Thread(my, "1号窗口").start();
        new Thread(my, "2号窗口").start();
        new Thread(my, "3号窗口").start();
    }
}
【输出结果】:
1号窗口正在买票5
1号窗口正在买票1
3号窗口正在买票3
2号窗口正在买票2
1号窗口正在买票4

为什么上面不会出现同一张票出现2次现象,那是因为在run()方法中,this.ticket-- 速度太快,不会出现资源同步问题,即同一时间几个线程读
取到同一张票,然后一个线程修改了ticket的值,还未写到主内存,另一个修改ticket的值这种问题。如果把 this.ticket-- 操作改成耗时比如
读写同一个文件,那就可能出现同步问题了,需要另外解决

上面的结果可得出结论:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。



  评论这张
 
阅读(55)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018