1. 程式人生 > 其它 >JAVA多執行緒的實現

JAVA多執行緒的實現

技術標籤:面試Java

目錄

參考連結

JAVA多執行緒實現的四種方式

Java多執行緒實現的四種方式

多執行緒實現方式

啟動執行緒 的唯一方法就是通過 Thread類的start()例項方法

start()方法是一個 native方法,它將啟動一個新執行緒,並 執行run()方法

第一二種方式:無返回值
通過重寫run方法,run方式的返回值是void,所以沒有辦法返回結果

繼承Thread類

  • 通過自己的類直接 extends Thread
  • 重寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法
  • start() 啟動執行緒
public class MyThread extends Thread {  

	@Override
  public void run() {  
   System.out.println("start");  
  }  
  
}  

public static void main(String[] args) { 

	MyThread myThread1 = new MyThread();  
	
	myThread1.start();  
}

實現Runnable介面

  • 實現Runnable介面,並 重寫run() 方法
  • 實現Runnable介面的 實現類的例項物件
    作為 Thread建構函式的target
public class MyThread implements Runnable {  

	@Override
  public void run() {  
   System.out.println("start");  
  }  
  
}

public static void main(String[] args) {

	MyThread myThread2 = new MyThread();  
	Thread thread = new Thread(myThread2);  
	thread.start();
}

ExecutorService、Callable都是屬於Executor框架;有返回值

實現Callable介面

  • 實現Callable介面 ,並 重寫Call() 方法
  • 實現Callable介面的 實現類的例項物件,使用 FutureTask類包裝Callable物件,該FutureTask物件封裝了Callable物件的Call方法的返回值
  • 使用 FutureTask物件作為Thread物件的target 建立並啟動執行緒
  • 呼叫 FutureTask物件的get() 來獲取子執行緒執行結束的返回值
public class MyThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

public static void main(String[] args) throws Exception {

        MyThread myThread3 = new MyThread();
        FutureTask<String> future = new FutureTask<>(myThread3); 
        
        Thread t = new Thread(future);
        t.start();
        ...
        String result = future.get(); //同步獲取返回結果
        System.out.println(result);
        
 }

執行緒池

public class MyThread implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("start");
    }
    
    public static void main(String[] args) {
    
        MyThread task = new MyThread();
        ExecutorService ex = Executors.newCachedThreadPool();
        ex.execute(task);
        ...
    }
}