多线程<一>创建的五中方式

一,多线程创建方式一继承Thread类创建线程

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

 1 public class MyThread extends Thread {  
 2   public void run() {  
 3    System.out.println("MyThread.run()");  
 4   }  
 5 }  
 6  
 7 MyThread myThread1 = new MyThread();  
 8 MyThread myThread2 = new MyThread();  
 9 myThread1.start();  
10 myThread2.start();

这种方式主要的原理就是继承了tread类,当

我们来看一下源码当调用start方法的时候,就会调用start0的方法,而start0有一个native关键字,我们可以理解成当调用start0的时候才去调用了run的方法。

 1  public synchronized void start()
 2     {
 3         boolean flag;
 4         if(threadStatus != 0)
 5             throw new IllegalThreadStateException();
 6         group.add(this);
 7         flag = false;
 8         start0();
 9         flag = true;
10         try
11         {
12             if(!flag)
13                 group.threadStartFailed(this);
14         }
15         catch(Throwable throwable) { }
16         break MISSING_BLOCK_LABEL_70;
17         Exception exception;
18         exception;
19         try
20         {
21             if(!flag)
22                 group.threadStartFailed(this);
23         }
24         catch(Throwable throwable1) { }
25         throw exception;
26     }
27 
28     private native void start0();

2、实现Runnable接口创建线程

如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口,如下:

1 public class MyThread extends OtherClass implements Runnable {  
2   public void run() {  
3    System.out.println("MyThread.run()");  
4   }  
5 }  

为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:

1 MyThread myThread = new MyThread();  
2 Thread thread = new Thread(myThread);  
3 thread.start()

事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:

1 public void run() {  
2   if (target != null) {  
3    target.run();  
4   }  
5 }  

这里应用了典型的回掉函数,A调用B,B在调用A,在定义一个接口定义准则,确定规范。

三,匿名函数创建

匿名函数必须要继承父类或者实现接口的。

有时候我们只用一次的话那么就可以用匿名函数了。

1 new Thread() {//创建方式1
2     public void run() {
3         for(int x=0; x<50; x++) {        
4             System.out.println(Thread.currentThread().getName()+"....x="+x);
5         }
6     }
7 }.start();
1 new Thread(new Runnable() {//创建方式2
2     public void run() {    
3         for(int x=0; x<50; x++) {        
4             System.out.println(Thread.currentThread().getName()+"....z="+x);
5         }
6     }
7 }).start();

 

猜你喜欢

转载自www.cnblogs.com/qingruihappy/p/9356917.html
今日推荐