首頁 >Java >java教程 >java中創建線程有幾種方式

java中創建線程有幾種方式

王林
王林轉載
2019-11-25 17:35:392498瀏覽

java中創建線程有幾種方式

執行緒的建立方式

#1、繼承Thread類別實作多執行緒

2、覆寫Runnable ()介面實作多線程,而後同樣覆寫run()。推薦此方式

3、使用Callable和Future建立執行緒

相關影片教學推薦:java學習影片

##實例如下:

1、繼承Thread類別實作多執行緒

/*
 * 继承Thread类创建线程
 * 1、重写run方法
 * 2、创建thread类的实例,即创建线程对象
 * 3、调用线程对象的start()来启动该线程
 * 注意:Thread类的每个进程之间不能共享该实例变量;具有单继承局限
 * */
public class StartThread extends Thread{
 
 private int i;
 @Override
 //重写run方法
 public void run() {
  // TODO Auto-generated method stub
  for(i=0;i<10;i++) {
   System.out.println(getName()+"  "+i);
   
  }
 }
 public static void main(String[] args) {
  for(int i=0;i<10;i++) {
   System.out.println(Thread.currentThread().getName()+ " ,"+i);
   //创建thread类的实例
   StartThread h1=new StartThread();
   StartThread h2=new StartThread();
   if(i==2) {
    //启动第一个进程
    h1.start();
    //启动第二个进程
    h2.start();
    
   }
   
  }
 }
 
}

2、覆寫Runnable()介面實作多執行緒,而後同樣覆寫run()

定義Runnable ()介面的實作類,重寫Run()方法。

建立Runnable實作類別的實例,並以此實例作為Thread的target來建立Thread物件。這個Thread物件才是真正的執行緒物件

透過呼叫執行緒物件的start()方法來啟動執行緒

/*创建线程方式二
 * 1、创建:实现Runnable+重写run
 * 2、启动:创建实现类对象+Thread对象+start
 * 
 * 注意:推荐使用,避免单继承的局限性,优先使用接口
 * 方便共享资源
 * */

public class MyThread2 implements Runnable {//实现Runnable接口
  public void run(){
  //重写run方法
  // TODO Auto-generated method stub
  //当线程类实现Runnable接口时
  //如果想要获取当前线程,只能使用Thread.currentThread方法
  for(;i<100;i++)
  {
   System.out.println(Thread.currentThread().getName()+" "+i);
  }  
  
}

public class Main {
  public static void main(String[] args){
    //启动线程1
      //不像继承Thread类一样,直接可以实例化对象即可,Runnable接口必须要
     //先创建实例,再将此实例作为Thread的target来创建Thread对象
    //创建并启动线程
    MyThread2 myThread=new MyThread2();

    Thread thread=new Thread(myThread);

    thread().start();

    //或者    new Thread(new MyThread2()).start();
  }
}

3、使用Callable和Future建立執行緒

和Runnable介面不一樣,Callable介面提供了一個call()方法作為執行緒執行體,call()方法比run()方法功能強大。

call()方法可以有回傳值

call()方法可以宣告拋出例外

public class Main {

  public static void main(String[] args){

   MyThread3 th=new MyThread3();

   //使用Lambda表达式创建Callable对象

     //使用FutureTask类来包装Callable对象
   FutureTask<Integer> future=new FutureTask<Integer>(
    (Callable<Integer>)()->{
      return 5;
    }
    );
     //实质上还是以Callable对象来创建并启动线程
   new Thread(task,"有返回值的线程").start();

    try{
       //get()方法会阻塞,直到子线程执行结束才返回
    System.out.println("子线程的返回值:"+future.get());
    }catch(Exception e){
    ex.printStackTrace();
   }
  }
}

相關文章教學推薦:

java程式入門

以上是java中創建線程有幾種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除