`
LXL_yes777
  • 浏览: 11268 次
文章分类
社区版块
存档分类
最新评论

多线程(一)——Thread类与Runnable接口

 
阅读更多

 多线程(一)——ThreadRunnable 

  在JAVA中实现多线程的操作有两种方法,一种是继承Thread类,另外一种是实现Runnable接口。

  通过Thread类和Runnable接口都可以实现多线程,那么两者之间又有那些区别与联系呢?首先我们看一下Thread的定义:

 

Public class Thread implements Runnable

 

 有没有发现什么呢?哈哈,原来Thread类也是实现Runnable接口,既然如此,那这和Runnable接口的实现类有什么区别呢?

我们先看一下Thread类中的run()方法,源码如下:

public void run() {
        if (target != null) {
            target.run();
        }
}

 

        而targetRunnable的对象,所以,通过上面的代码我们会发现,在Thread类中的run()方法调用的是Runnable接口中的run()方法,所以如果要通过继承Thread类来实现多线程,就需要重写run()方法。

       同时,我们都知道启动一个线程要通过start()方法来实现,但是Runnable接口中并没有start()方法,所以Runnable接口的实现类的启动还是要依靠Thread类来完成.

下列中,WThreadRunnable接口的子类:

  WThread wt=new WThread();
  Thread t=new Thread(wt);
  t.start();

 

        由上面的分析我们可以知道,Thread类和Runnable接口是相互依靠,彼此相联系的。

而它们最主要的区别在于如果一个类继承Thread类,则不适合于多个线程共享一个资源(当然你也可以用线程同步来解决,呵呵......),而实现了Runnable接口可以很好地解决这一问题。我们假设一个卖票的情景,共有10张票,然后启动四个线程去买票。

通过继承Thread类实现,代码如下:

 

public class WThread extends Thread{
int ticket=3;
	public static void main(String []args){
		for(int i=0;i<3;i++){
			WThread wt=new WThread();
			wt.start();
		}
	}
	public void run(){
		while(true){
			if(ticket>0){
				System.out.println("线程"+Thread.currentThread().getName()+"没买票之前还有余票:ticket"+ticket--+"张");
			}
		}
	}
}

 

 程序执行结果如下:



 
 

而通过实现Runnable接口来完成此功能,代码实现如下: 

 

public class fWThread implements Runnable{
         int ticket=3;
         public static void main(String []args){
	WThread wt=new WThread();
	for(int i=0;i<3;i++){
	       new Thread(wt).start();
	}
         }

         public void run(){
	while(true){
	       if(ticket>0){
		System.out.println("线程"+Thread.currentThread().getName()+"没买票之前还有余票:ticket"+ticket--+"张");			         }
	}
        }
}

   

 程序结果运行如下:



          从以上两个程序的运行结果我们可以清楚的发现,同Thread类实现多线程并没有达到我们想要的结果,它不是总共有3张票,而是每个线程各自拥有3张票;而通过继承Runnable接口实现的多线程,三个线程一共才拥有3张票,即票是几个线程对象所共享的。可见实现Runnable接口相对于继承Thread类来说,更适合于多个线程去访问或操纵同一资源的情况,当然通过线程同步用Thread类也可以实现上述功能啦!!!!

 

 

 

 

  • 大小: 7.4 KB
  • 大小: 3.4 KB
分享到:
评论

相关推荐

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口(csdn)————程.pdf

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口(csdn)————程

    java多线程设计模式详解(PDF及源码)

    单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...

    多线程

    2. 利用Runnable接口实现与第1题相同的功能; 3. 测试一个Applet小应用程序,体会多线程程序的运行过程; 三、实验步骤 1. 按照要求编写第1题中的代码,并将其编译、运行。 1) 由于第一个线程和第二个线程的功能...

    多线程文章目录

    以下文章基本上保证真实可信,如...Java多线程②——多线程知识梳理 有助于了解线程池相关的知识、包括线程池执行逻辑、常用方法; 以及java为我们提供常用的线程池和任务调度ScheduledExecutorService以及工作窃取For

    JAVA实验报告

    (二)实现Runnable接口的方法实现多线程 59 实验10 数据库的连接:JDBC 61 一、实验目的 61 二、实验要求 61 三、实验内容 61 (一)配置ODBC数据源 61 (二)编写程序,按照下表的结构建立"student"表 61 (三)...

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    通常有 两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出 子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是...

    Java进阶学习——Java多线程知识的理解

    Java多线程知识的理解0.前言1.从一道题目引入2.创建线程2.1.继承Thread类2.2.实现Runnable接口3.线程的生命周期4.线程安全4.1.为什么需要线程安全?4.2.如何实现线程安全?5.线程池5.1.为什么需要线程池?5.2.创建...

    Android多线程及异步处理问题详细探讨

    2)多线程实现方式implements Runnable 或 extends Thread 3)多线程核心机制是Handler 4)提供如下几种实现方式 —-1—–Handler ————————————说明1 创建一个Handler时一定要关联一个Looper实例,默认...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    Java开发技术大全 电子版

    11.1集合接口与抽象类329 11.1.1Collection接口330 11.1.2Iterator接口330 11.1.3AbstractCollection抽象类331 11.1.4几个常用术语332 11.2集合类的使用333 11.2.1顺序表(ArrayList)使用示例333 11.2.2链表...

    java初学者必看

    10.1.10 抽象类与接口区别 10.2 内部类概念 10.3 成员内部类 10.3.1 创建内部类对象 10.3.2 内部类的this引用 10.3.3 成员内部类的修饰符 10.4 方法内部类 10.5 匿名内部类 10.5.1 继承式 10.5.2 接口式 ...

    java经典面试2010集锦100题(不看你后悔)

    C) 抽象类与接口的用法几乎都相同,具体用哪一个方法,只是在于程序设计人员的编程习惯而已。 D) 在Java中,最多使用的是抽象类,因为应用抽象类也可以实现多继承。而接口已经被限制使用。 题目21:d 程序如下: ...

Global site tag (gtag.js) - Google Analytics