1. 程式人生 > >Java多執行緒-----建立執行緒的三種方式

Java多執行緒-----建立執行緒的三種方式

   1.繼承Thread類建立執行緒

  • 定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體
  • 建立Thread子類的例項,也就是建立了執行緒物件
  • 啟動執行緒,即呼叫執行緒的start()方法
package com.practise.thread;

public class InheritThread extends Thread {

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() 
+ ":" + i); } } } package com.practise.thread; public class ThreadTest { public static void main(String[] args) { //執行緒類 InheritThread inheritThread = new InheritThread(); inheritThread.setName("執行緒一");//設定執行緒名稱 inheritThread.start();
//主執行緒 Thread.currentThread().setName("主執行緒"); for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }

   2.實現Runnable介面建立執行緒

  • 定義Runnable介面的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體
  • 建立Runnable實現類的例項,並用這個例項作為Thread的target來建立Thread物件,這個Thread物件才是真正的執行緒物件
  • 呼叫執行緒物件的start()方法來啟動執行緒
package com.practise.thread;

public class ImplementRunnable implements Runnable {

    @Override
    public void run() {        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

}


package com.practise.thread;

public class ThreadTest {
    public static void main(String[] args) {        
        //實現Runnable介面
        ImplementRunnable implementRunnable=new ImplementRunnable();
        Thread thread=new Thread(implementRunnable);
        thread.setName("執行緒二");
        thread.start();
        
        //主執行緒
        Thread.currentThread().setName("主執行緒");        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }                
    }
}

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

  • 建立Callable介面的實現類,並實現call()方法,然後建立該實現類的例項(從java8開始可以直接使用Lambda表示式建立Callable物件)
  • 使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了Callable物件的call()方法的返回值
  • 使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實現了Runnable介面)
  • 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值
package com.practise.createthread;

import java.util.concurrent.Callable;

public class ImplementCallable implements Callable<Integer> {

    @Override
    public Integer call() {
        Integer total = 0;
        try {
            for (int i = 1; i <= 50; i++) {
                total += i;
            }
            return total;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}


package com.practise.createthread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadTest {
    public static void main(String[] args) {        
        ImplementCallable implementCallable=new ImplementCallable();
        FutureTask<Integer> task=new FutureTask<Integer>(implementCallable);
        Thread thread=new Thread(task,"有返回值的執行緒");
        thread.start();
        try {
            System.out.println(task.get());
        } catch (Exception ex) {
            ex.printStackTrace();
        } 
        
        Thread.currentThread().setName("主執行緒");        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }                
    }
}