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

猜你喜欢

转载自youyu4.iteye.com/blog/2351218