Java 多线程——Thread类和Runable接口

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的
run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,

下面看例子:

[java] view plaincopy

  1. package org.thread.demo;
  2. class MyThread extends Thread{
  3. private String name;
  4. public MyThread(String name) {
  5. super();
  6. this.name = name;
  7. }
  8. public void run(){
  9. for(int i=0;i<10;i++){
  10. System.out.println("线程开始:"+this.name+",i="+i);
  11. }
  12. }
  13. }
  14. package org.thread.demo;
  15. public class ThreadDemo01 {
  16. public static void main(String[] args) {
  17. MyThread mt1=new MyThread("线程a");
  18. MyThread mt2=new MyThread("线程b");
  19. mt1.run();
  20. mt2.run();
  21. }
  22. }

但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动start()方法启动线程:

[java] view plaincopy

  1. package org.thread.demo;
  2. public class ThreadDemo01 {
  3. public static void main(String[] args) {
  4. MyThread mt1=new MyThread("线程a");
  5. MyThread mt2=new MyThread("线程b");
  6. mt1.start();
  7. mt2.start();
  8. }

这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?
在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了 private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术称为JNI技术(java Native Interface)

·Runnable接口
在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

[java] view plaincopy

  1. package org.runnable.demo;
  2. class MyThread implements Runnable{
  3. private String name;
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7. public void run(){
  8. for(int i=0;i<100;i++){
  9. System.out.println("线程开始:"+this.name+",i="+i);
  10. }
  11. }
  12. }

但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)
此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):

[java] view plaincopy

  1. package org.runnable.demo;
  2. import org.runnable.demo.MyThread;
  3. public class ThreadDemo01 {
  4. public static void main(String[] args) {
  5. MyThread mt1=new MyThread("线程a");
  6. MyThread mt2=new MyThread("线程b");
  7. new Thread(mt1).start();
  8. new Thread(mt2).start();
  9. }
  10. }

两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比
继承Thread类有如下好处:
->避免点继承的局限,一个类可以继承多个接口。
->适合于资源的共享

以卖票程序为例,通过Thread类完成:

[java] view plaincopy

  1. //使用Thread实现线程不能实现资源共享
  2. class MyThread extends Thread
  3. {
  4. private int ticket=10;
  5. private String name;
  6. public MyThread(String name ){
  7. this.name=name;
  8. }
  9. public void run(){
  10. for(int i=0;i<10;i++){
  11. if(ticket>0){
  12. System.out.println("线程"+name+"卖票"+(ticket--));
  13. }
  14. }
  15. }
  16. }
  17. public class ThreadTicket
  18. {
  19. public static void main(String args[]){
  20. MyThread A = new MyThread("A");
  21. MyThread B = new MyThread("B");
  22. A.start();
  23. B.start();
  24. }
  25. }
  26. //使用Runnable实现线程可以实现资源共享
  27. class MyThread implements Runnable
  28. {
  29. private int ticket=10;
  30. private String name;
  31. public MyThread(String name){
  32. this.name=name;
  33. }
  34. public void run(){
  35. for(int i=1;i<=10;i++){
  36. if(ticket>0){
  37. System.out.println("线程"+name+"卖票"+(ticket--));
  38. }
  39. }
  40. }
  41. }
  42. public class ThreadTicket
  43. {
  44. public static void main(String args[]){
  45. MyThread A = new MyThread("A");  //实例化线程要执行的任务
  46. Thread Ta = new Thread(A);    //实例两个线程对象,实际传递的是一个任务
  47. Thread Tb = new Thread(A);    //因为两个线程执行的是一个任务,所以资源是共享的
  48. Ta.start();
  49. Tb.start();
  50. }
  51. }

虽然现在程序中有两个个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

Runnable接口和Thread之间的联系:public class Thread extends Object implements Runnable
容易看出Thread类是Runnable接口的子类。

				
时间: 2024-10-08 23:53:58

Java 多线程——Thread类和Runable接口的相关文章

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

Java多线程的两种实现方式:继承Thread类 &amp; 实现Runable接口

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! 创建和启动线程的两种传统方式: Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法.

多线程-----Thread类与Runnable接口的区别

第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMyThread的时候在创建三个对象的同时创建了三个线程:实现Runnable的, 相当于是拿出一个卖早餐10份的任务给三个人去共同完成,newMyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行. 一个类只能继承一个父类,存在局限:一个类可以实现多个接口.在

JavaSE学习52:细说多线程之Thread类和Runable接口

一线程创建的两种方式比较 线程创建和启动有两种方式,这里只是列出步骤,不再进行详细解释. (1)继承Thread类 class MyThread extends Thread{ public void run(){ ... } } MyThread mt=new MyThread();//创建线程 mt.start();//启动线程 (2)实现Runnable接口 class MyThread implements Runnable{ public void run(){ ... } } MyT

Java多线程和并发(三),Thread类和Runnable接口

目录 1.Thread和Runnable接口 三.Thread类和Runnable接口 1.Thread和Runnable接口 原文地址:https://www.cnblogs.com/xzmxddx/p/10362804.html

java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

 java多线程创建方法http://blog.csdn.net/cjc211322/article/details/24999163  java创建多线程方法之间的区别http://blog.csdn.net/cjc211322/article/details/25000449 java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

几种创建线程方式Thread类和Runnable接口

对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧. 一.线程的创建方式有三种 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口(返回结果并且可能抛出异常的任务). 如果采用实现Callable接口接口的方式,返回结果并且可能抛出异常的任务,不利于开发,这里就不给大家介绍了.这里咋们主要说说采用继承Thread类和实现Runnable接口的方式来创建线程. 1.继承Thread类的方

Java 线程--继承java.lang.Thread类实现线程

现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有独立的内存空间. 2.同一个进程中的线程共享其进程中的内存和资源. (共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的栈内存) 我们还需要了解以下基本内容: 1.什么是进程? 一个进程对应一个应用程序.例如:在Windows操作系统启动word就表示启动了一个进程.在Java开发环境下

Java多线程——Thread的native底层实现

Java多线程 当我们去阅读java的Thread类的时候,会发现这个类与大部分的java类库API有着明显的差别,它的所有关键方法都被声明为native. native本身指代的就是本地方法,而又由于java线程模型采用基于操作系统原生线程模型,这里默认Thread中native方式代指的是Native POSIX Thread Library. 线程的实现方式有三种:分别是内核线程实现(1:1实现),使用用户线程实现(1:N),使用用户线程加轻量级进程混合实现(N:M实现).而Java从1.