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

JAVA中實現多執行緒的常用方式

技術標籤:多執行緒jdkjavathread

JAVA中實現多執行緒的常用方式

JAVA實現多執行緒的三種方式:

  • 繼承Thread類並且重寫run方法
  • 實現Runnable介面,並且實現介面中的run方法,使用Thread類的有參構造將實現類作為引數傳入
  • 實現Callable介面並且實現介面中的call方法

1.繼承Thread類並且重寫run方法

public class TestMyThread extends Thread{
    public static void main(String[] args) {
        Thread myThread = new TestMyThread
(); myThread.setName("分支執行緒"); myThread.start(); System.out.println(Thread.currentThread().getName()+"執行緒"); } //重寫Thread類中的run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()); } }

執行結果:
執行結果

2.實現Runnable介面,並且實現介面中的run方法

public class TestMyRunnable implements Runnable{
    public static void main(String[] args) {
        TestMyRunnable myRunnable = new TestMyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.setName("分支執行緒");
        thread.start();
        System.out.println(Thread.
currentThread().getName()+"執行緒"); } @Override public void run() { System.out.println(Thread.currentThread().getName()); } }

執行結果:
執行結果
3.實現Callable介面並且實現介面中的call方法
Callable是jdk8的新特性 介面中的call方法可以丟擲異常
而Runnable中的run方法不行並且call有返回值而run方法沒有
但是這種方式效率比較低

public class TestMyCallable implements Callable<String> {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestMyCallable myCallable = new TestMyCallable();
        FutureTask<String> futureTask = new FutureTask<>(myCallable);
        Thread thread = new Thread(futureTask);
        thread.setName("分支執行緒");
        thread.start();
        for (int i = 0; i <1000 ; i++) {
            System.out.println(Thread.currentThread().getName()+"------->"+i);
        }
        //get方法會導致主執行緒阻塞 在沒拿到分支執行緒執行結果之前一直等待
        //get方法必須等待分支執行緒執行完之後才能拿到執行結果並且返回
        System.out.println(futureTask.get()); 
        System.out.println(Thread.currentThread().getName()+"執行緒");

    }
    @Override
    public String call() throws Exception {
        for (int i = 0; i <1000 ; i++) {
            System.out.println(Thread.currentThread().getName()+"----->"+i);
        }
        return Thread.currentThread().getName();
    }
}

執行結果:
執行結果