多線程-實現多線程的幾種方案

三種實現多線程的方式:

無返回值:繼承Thread類,或者實現Runnable接口(如果當前類已經繼承了其他類)

有返回值:實現Callable接口


public class Test {
    public static void main(String[] args) throws ExecutionException,
            InterruptedException{
        // thread class
        ThreadTest1 threadTest1 = new ThreadTest1();
        threadTest1.start();
        // Runnable interface
        ThreadRunnableTest threadRunnableTest = new ThreadRunnableTest();
        Thread thread = new Thread(threadRunnableTest);
        thread.start();
        // Callable interface
        System.out.println("----程序開始運行----");
        Date date1 = new Date();

        int taskSize = 8;
        // 創建一個線程池
        ExecutorService pool = Executors.newFixedThreadPool(taskSize);
        // 創建多個有返回值的任務
        List<Future> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Callable<Object> c = new ThreadCallableTest(i + "");
            Future f = pool.submit(c);
            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()) + "毫秒】");
    }


public class ThreadCallableTest implements Callable<Object> {

    private String taskNum;

    public ThreadCallableTest(String taskNum) {
        this.taskNum = taskNum;
    }

    @Override
    public Object call() throws Exception {
        System.out.println(">>>" + taskNum + "任務啓動");
        System.out.println(Thread.currentThread().getName());
        Date dateTmp1 = new Date();
        //Thread.sleep(100);
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();
        System.out.println(">>>" + taskNum + "任務終止");
        return taskNum + "任務返回運行結果,當前任務時間【" + time + "毫秒】";
    }
}

public class ThreadRunnableTest implements Runnable{
    @Override
    public void run() {
        System.out.println("測試runnable接口");
    }
}


public class ThreadTest1 extends Thread{

    public void run(){
        System.out.println("測試Thread");
    }
}


線程池,信號量。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章