快速排序 快速排序可能是應用最廣泛的演算法了。快排流行的原因在於實現簡單、並且適用於各種不同的輸入數據,因此在一般的應用中比其他排序演算法都要快很多。快排的優點在於其是原地排序,不向歸併至少需要建立一個和排序數組大小一樣的數組,並且快排的時間複雜度和NlgN成正比 基本思想 快速排序是一種分治的排序演算法 ...
下文筆者講述java中多線程的實現方式,如下所示:
JAVA中多線程主要有以下實現方式:
1.繼承Thread類
2.實現Runnable介面
3.使用ExecutorService、Callable、Future實現有返回結果的多線程
註意事項:
方式1和方式2線程運行完畢後,是沒有返回值
繼承Thread類實現多線程
註意事項: 1.Thread本質上也是實現了Runnable介面的一個實例 Thread它指一個線程實例 2.啟動Thread類,需使用start()方法 start()方法是一個native方法 它的功能:啟動一個新線程,並執行run()方法 3.使用Thread生成多線程,我們只需繼承Thread類,重寫run方法即可例:
public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } } //開啟兩個線程 MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start();
使用Runnable介面方式實現多線程
例://定義一個多線程 public class MyThread extends TestClass implements Runnable { public void run() { System.out.println("MyThread.run()"); } } //啟動線程 MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start();
使用ExecutorService、Callable、Future實現有返回結果的多線程
ExecutorService、Callable、Future 對象都屬於Executor框架中的功能類例:多線程帶返回值
import java.util.concurrent.*; import java.util.Date; import java.util.List; import java.util.ArrayList; /** * 有返回值的線程 */ @SuppressWarnings("unchecked") public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println("----程式開始運行----"); Date date1 = new Date(); int taskSize = 5; // 創建一個線程池 ExecutorService pool = Executors.newFixedThreadPool(taskSize); // 創建多個有返回值的任務 List<Future> list = new ArrayList<Future>(); for (int i = 0; i < taskSize; i++) { Callable c = new MyCallable(i + " "); // 執行任務並獲取Future對象 Future f = pool.submit(c); // System.out.println(">>>" + f.get().toString()); list.add(f); } // 關閉線程池 pool.shutdown(); // 獲取所有併發任務的運行結果 for (Future f : list) { // 從Future對象上獲取任務的返回值,並輸出到控制台 System.out.println(">>>" + f.get().toString()); } Date date2 = new Date(); System.out.println("----程式結束運行----,程式運行時間【" + (date2.getTime() - date1.getTime()) + "毫秒】"); } } class MyCallable implements Callable<Object> { private String taskNum; MyCallable(String taskNum) { this.taskNum = taskNum; } public Object call() throws Exception { System.out.println(">>>" + taskNum + "任務啟動"); Date dateTmp1 = new Date(); Thread.sleep(1000); Date dateTmp2 = new Date(); long time = dateTmp2.getTime() - dateTmp1.getTime(); System.out.println(">>>" + taskNum + "任務終止"); return taskNum + "任務返回運行結果,當前任務時間【" + time + "毫秒】"; } }