Java多線程實現(四種方法)

來源:互聯網
上載者:User

標籤:run   ted   擷取   四種方法   參數傳遞   指定   必須   sub   線程池   

 

1.繼承Thread類,重寫run方法(其實Thread類本身也實現了Runnable介面)

2.實現Runnable介面,重寫run方法

3.實現Callable介面,重寫call方法(有傳回值)

4.使用線程池(有傳回值)

 

1.繼承Thread類,重寫run方法

  每次建立一個新的線程,都要建立一個Thread子類的對象

  啟動線程,new Thread子類().start()

public class MyThread {    public static void main(String ards[]){        for(int i=0;i<10;i++){            new ExtendsThread().start();        }        System.out.println(Thread.currentThread().getName());    }    }class ExtendsThread extends Thread{    @Override    public void run() {        System.out.println(Thread.currentThread().getName());    }}

 

2.實現Runnable介面,重寫run方法

  不論建立多少個線程,只需要建立一個Runnable介面實作類別的對象

  啟動線程,new Thread(Runnable介面實作類別的對象).start()

 

public class MyThread {    public static void main(String ards[]){        Runnable implRunnable = new ImplRunnable();        for(int i=0;i<10;i++){            new Thread(implRunnable).start();        }        System.out.println(Thread.currentThread().getName());    }    }class ImplRunnable implements Runnable{    private volatile  int i = 0;    @Override    public void run() {        System.out.println(Thread.currentThread().getName()+"--"+ i++);            }}

 

3.實現Callable介面,重寫call方法(有傳回值)

  自訂類實現Callable介面時,必須指定泛型,該泛型即傳回值的類型

  每次建立一個新的線程,都要建立一個新的Callable介面的實作類別、

  如何啟動線程?

    (1)建立一個Callable介面的實作類別的對象

    (2)建立一個FutureTask對象,傳入Callable類型的參數

        public FutureTask(Callable<V> callable){……}

    (3)調用Thread類重載的參數為Runnable的構造器建立Thread對象

        將FutureTask作為參數傳遞

        public class FutureTask<V> implements RunnableFuture<V>

        public interface RunnableFuture<V> extends Runnable, Future<V>

  如何擷取傳回值?

    調用FutureTask類的get()方法

public class MyThread {    public static void main(String ards[]) throws InterruptedException, ExecutionException{        for(int i=0;i<10;i++){            Callable<Integer> implCallable = new ImplCallable();            FutureTask<Integer> futureTask = new FutureTask<Integer>(implCallable);            new Thread(futureTask).start();            System.out.println(Thread.currentThread().getName()+"----"+futureTask.get());        }        System.out.println(Thread.currentThread().getName());    }    }class ImplCallable implements Callable<Integer>{    @Override    public Integer call() throws Exception {        int result = 0;        for(int i=0;i<10;i++){            result += i;        }        System.out.println(Thread.currentThread().getName());        return result;    }}

 

4.線程池

Executors類

 

package multi.thread;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * @author DuanJiaPing * @date 2018/6/11 22:02 * * 線程池 * 跟資料庫連接池類似 * 避免了線程的建立和銷毀造成的額外開銷 * * java.util.concurrent * * Executor    負責現成的使用和調度的根介面 *    |--ExecutorService    線程池的主要介面 *          |--ThreadPoolExecutor    線程池的實作類別 *          |--ScheduledExecutorService    介面,負責線程的調度 *              |--ScheduledThreadPoolExecutor    (extends ThreadPoolExecutor implements ScheduledExecutorService) * * * Executors工具類 * 提供了建立線程池的方法 * * */public class ThreadPool {    public static void main(String[] args){        //使用Executors工具類中的方法建立線程池        ExecutorService pool = Executors.newFixedThreadPool(5);        ThreadPoolDemo demo = new ThreadPoolDemo();        //為線程池中的線程分配任務,使用submit方法,傳入的參數可以是Runnable的實作類別,也可以是Callable的實作類別        for(int i=1;i<=5;i++){            pool.submit(demo);        }        //關閉線程池        //shutdown : 以一種平和的方式關閉線程池,在關閉線程池之前,會等待線程池中的所有的任務都結束,不在接受新任務        //shutdownNow : 立即關閉線程池        pool.shutdown();    }}class ThreadPoolDemo implements Runnable{    /**多線程的共用資料*/    private int i = 0;    @Override    public void run() {        while(i<=50){            System.out.println(Thread.currentThread().getName()+"---"+ i++);        }    }}

 

 

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class ThreadPool2 {        public static void main(String args[]){        ExecutorService executorService = Executors.newFixedThreadPool(5);                for(int i=0;i<5;i++){            Future<Integer> future = executorService.submit(new Callable<Integer>() {                @Override                public Integer call() throws Exception {                    int result = 0;                    for(int i=0;i<=10;i++){                        result += i;                    }                    return result;                }            });                        try {                System.out.println(Thread.currentThread().getName()+"--"+future.get());            } catch (InterruptedException | ExecutionException e) {                e.printStackTrace();            }        }                executorService.shutdown();    }}

 

 

 

    

        

          

 

Java多線程實現(四種方法)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.