多线程的四种实现方式
1.繼承Thread類,重寫run方法
2.實現(xiàn)Runnable接口,重寫run方法
3.通過Callable和ExecutorService創(chuàng)建線程
4.通過線程池創(chuàng)建線程
前面兩種可以歸結為一類:無返回值(通過重寫run方法,run方式的返回值是void,所以沒有辦法返回結果)
后面兩種可以歸結成一類:有返回值,通過Callable接口,就要實現(xiàn)call方法,這個方法的返回值是Object,所以返回的結果可以放在Object對象中
第一種:繼承Thread類,重寫run方法
public class Test1 extends Thread{public Test1(){//編寫子類的構造方法}public void run(){// System.out.println(111);//編寫自己的線程代碼//Thread.currentThread表示當前代碼段正在被哪個線程調用的相關信息System.out.println(Thread.currentThread().getName());}public static void main(String[] args) {Test1 test1 = new Test1();test1.setName("我是線程1");test1.start();System.out.println(Thread.currentThread().toString());}}運行結果:
Thread[main,5,main] 我是線程1第二種:實現(xiàn)Runnable接口,重寫run方法
public class Test2 {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());Thread t1 = new Thread(new MyThread());t1.start();} } class MyThread implements Runnable{public void run() {System.out.println(Thread.currentThread().getName()+"->我是線程2");} }運行結果:
main Thread-0->我是線程2第三種:通過Callable和ExecutorService創(chuàng)建線程
public class Test3 {public static void main(String[] args) {Callable<Object> oneCallable = new Tickets<Object>();FutureTask<Object> oneTask=new FutureTask<Object>(oneCallable);Thread t = new Thread(oneTask);System.out.println(Thread.currentThread().getName());t.start();} } class Tickets<Object> implements Callable<Object>{public Object call() throws Exception {System.out.println(Thread.currentThread().getName()+"我是線程3");return null;} }運行結果:
main Thread-0我是線程3第四種:通過線程池創(chuàng)建線程
public class Test4 {private static int POOL_NUM=10;public static void main(String[] args) throws InterruptedException {//線程池的數(shù)量ExecutorService executorService = Executors.newFixedThreadPool(5);for(int i=0;i<POOL_NUM;i++){RunnableThread thread = new RunnableThread();executorService.execute(thread);}//關閉線程池executorService.shutdown();} }class RunnableThread implements Runnable{public void run() {System.out.println("我是線程4:"+Thread.currentThread().getName());} }運行結果:
我是線程4:pool-1-thread-2 我是線程4:pool-1-thread-5 我是線程4:pool-1-thread-4 我是線程4:pool-1-thread-3 我是線程4:pool-1-thread-1 我是線程4:pool-1-thread-5 我是線程4:pool-1-thread-4 我是線程4:pool-1-thread-2 我是線程4:pool-1-thread-1 我是線程4:pool-1-thread-3Executors類:提供了一系列工廠方法用于創(chuàng)建線程池,返回的線程池都實現(xiàn)了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
創(chuàng)建固定數(shù)目線程的線程池。
public static ExecutorService newCachedThreadPool()
創(chuàng)建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現(xiàn)有線程沒有可用的,則創(chuàng)建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。
public static ExecutorService newSingleThreadExecutor()
創(chuàng)建一個單線程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int
corePoolSize)
創(chuàng)建一個支持定時及周期性的任務執(zhí)行的線程池,多數(shù)情況下可用來替代Timer類。
ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor后臺線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。
二、Thread 和Runnable 的區(qū)別和聯(lián)系
Thread其實本身就是實現(xiàn)了接口 Runnable的一個類;Thread類也是Runnable接口的子類。
因此 Thread中的方法和成員變量要比Runnable多,最典型地就是 Thread有start()方法,但是Runnable接口沒有start()方法;
實際開發(fā)中我們通常采用Runnable接口來實現(xiàn)多線程。實現(xiàn)Runnable接口比繼承Thread類有如下好處:?
1. 避免繼承的局限,一個類可以繼承多個接口,但是類只能繼承一個類。?
2. Runnable接口實現(xiàn)的線程便于資源共享。而通過Thread類實現(xiàn),各自線程的資源是獨立的,不方便共享。?
總結
以上是生活随笔為你收集整理的多线程的四种实现方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Computing Curricula
- 下一篇: c语言顺序存储学生成绩,C语言学习--实