`
youyu4
  • 浏览: 426774 次
社区版块
存档分类
最新评论

Java多线程之Thread和 Runable

 
阅读更多

Java多线程之Thread和 Runable

 

Java中实现多线程的方式:

 

 

继承Thread类

 

package com.multithread.learning;  
/** 
 *@functon 多线程学习 
 *@author 林炳文 
 *@time 2015.3.9 
 */  
class Thread1 extends Thread{  
    private String name;  
    public Thread1(String name) {  
       this.name=name;  
    }  
    public void run() {  
        for (int i = 0; i < 5; i++) {  
            System.out.println(name + "运行  :  " + i);  
            try {  
                sleep((int) Math.random() * 10);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
         
    }  
}  
public class Main {  
  
    public static void main(String[] args) {  
        Thread1 mTh1=new Thread1("A");  
        Thread1 mTh2=new Thread1("B");  
        mTh1.start();  
        mTh2.start();  
  
    }  
  
} 

 

 

输出:

A运行  :  0

B运行  :  0

A运行  :  1

A运行  :  2

A运行  :  3

A运行  :  4

B运行  :  1

B运行  :  2

B运行  :  3

B运行  :  4

 

再运行一下:

A运行  :  0

B运行  :  0

B运行  :  1

B运行  :  2

B运行  :  3

B运行  :  4

A运行  :  1

A运行  :  2

A运行  :  3

A运行  :  4

 

注意:

  • start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
  • 从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
  • Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
  • 实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

 

但是start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。

输出:

Exception in thread "main" java.lang.IllegalThreadStateException

    at java.lang.Thread.start(Unknown Source)

    at com.multithread.learning.Main.main(Main.java:31)

 

 

 

实现Runable接口

 

/** 
 *@functon 多线程学习 
 *@author 林炳文 
 *@time 2015.3.9 
 */  
package com.multithread.runnable;  
class Thread2 implements Runnable{  
    private String name;  
  
    public Thread2(String name) {  
        this.name=name;  
    }  
  
    @Override  
    public void run() {  
          for (int i = 0; i < 5; i++) {  
                System.out.println(name + "运行  :  " + i);  
                try {  
                    Thread.sleep((int) Math.random() * 10);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
          
    }  
      
}  
public class Main {  
  
    public static void main(String[] args) {  
        new Thread(new Thread2("C")).start();  
        new Thread(new Thread2("D")).start();  
    }  
  
}  

 

 

输出:

C运行  :  0

D运行  :  0

D运行  :  1

C运行  :  1

D运行  :  2

C运行  :  2

D运行  :  3

C运行  :  3

D运行  :  4

C运行  :  4

 

Thread类实际上也是实现了Runnable接口的类。

 

 

 

理解多线程中的start()和run()

 

  • start():用来启动线程,只有调用这个方法,线程才真正运行
  • run():线程的操作就写在这个方法里,所以定义线程类时都要重写这个方法

 

 

Thread和Runable的区别

 

Runable对比Thread的优势

 

  • 适合多个相同的程序代码的线程去处理同一个资源
  • 可以避免java中的单继承的限制
  • 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
  • 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

 

参考:

http://blog.csdn.net/evankaka/article/details/44153709

分享到:
评论

相关推荐

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java中的多线程

    java中的多线程,在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

    实现Runnable接口创建多线程.docx

    在Java中只支持单继承,因此通过继承Thread类创建线程有一定的局限性,这时可以使用另一种方式,即实现Runnable接口来...接下来在案例中将通过实现Runnable接口方式创建线程,并实现多线程分别打印0~99的数字的功能。

    Java多线程继承Thread类详解第1/2页

    Java多线程的两种实现方式:继承Thread类 & 实现Runable接口,今天我们来学习下继承Thread类,希望大家能够喜欢

    多线程例子

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口.(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用,此文这里不讲这个。

    Java多线程

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

    详解多线程及Runable 和Thread的区别

    主要介绍了多线程及Runable 和Thread的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java测试题2答案

    AE A public class X implements Runable{ public void run(){ ......} } B public class X implements Thread{ public void run(){ ......} } C public class X implements Thread{ public int run(){ ......

    【设计】java高级程序设计期末复习题.docx

    B、创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题。 C、Thread类属于java.util程序包。 D、以上说法无一正确。 2、运行下列程序, 会产生什么结果?( D ) public class X extends ...

    很多面试官相信的谣言,做为面试者,你该发声了!一道题角色逆转

    今天一个学妹跟我分享她今天的面试过程,她面试的是java开发岗,跟我说了面试官大概问了哪些问题,基本都是一些常规的基本知识,其中涉及到多线程的部分有这样一个问题。 面试官:(一脸严肃)说一下Thread和Runable有...

    Java面向对象程序设计试题一.doc

    } } A good and abc B good and gbc C test ok and abc D test ok and gbc A5、运行下列程序, 会产生什么结果 ( ) public class X extends Thread implements Runable{ public void run(){ System.out.println(...

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

    B) 在Java中布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在...

Global site tag (gtag.js) - Google Analytics