1. 程式人生 > >java 使用匿名內部類的方式建立執行緒並設定和獲取執行緒名字

java 使用匿名內部類的方式建立執行緒並設定和獲取執行緒名字

有些方法需要傳入介面的例項或者抽象類的例項物件,比如Thread有一個構造方法,Thread(Runnable target)

這時可以可以自定義類實現Runnable介面,重寫介面中的方法,將自定義類的物件傳入構造方法中

也可以使用匿名內部類,即在建立Thread物件時傳入Runnable介面,在其後面重寫介面的方法

這篇文章介紹下使用匿名內部類建立三個執行緒

package createThreads;

import java.util.concurrent.*;

public class anoymousThreadTest01 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //使用匿名內部類建立Thread物件,1
        new Thread(){
            @Override
            public void run() {
               System.out.println("hello world 1");
            }
        }.start();
        //2
        Thread t1=new Thread(){
            @Override
            public void run() {
                System.out.println( "hello world 2");
            }
        };
        t1.start();
        //使用匿名內部類建立Runnable介面例項,建立執行緒1
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println( "你好,世界 2");
            }
        }).start();
        //2
        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println( "你好,世界 2");
            }
        });
        t2.start();
        //使用匿名內部類建立Callable介面例項,建立執行緒
        ExecutorService es= Executors.newFixedThreadPool(2);//建立執行緒池
        Future<Integer> f=es.submit(new Callable<Integer>() { //建立Callable介面例項,重寫call方法,放入執行緒池
            @Override
            public Integer call() {
                return 3*5;
            }
        });
        System.out.println( f.get());      //輸出返回的結果
        es.shutdown();                      //關閉執行緒池
    }
}
out:
你好,世界 2
hello world 1
你好,世界 2
hello world 2
15

獲取名字和設定名字的三種方式,以Thread為例,獲取當前執行緒物件可以試用Thread類的靜態方法currentThread()

public class anoymousThreadTest02 {
    public static void main(String[] args){
        //設定執行緒名字,1利用Thread類的setName方法
        Thread t1=new Thread(){
            @Override
            public void run() {
                System.out.println( "執行緒t1的名字是: "+this.getName());
            }
        };
        t1.setName("執行緒t1");
        //2,在Thread類的構造方法中傳入名字
        Thread t2=new Thread("執行緒t2"){
            @Override
            public void run() {
                System.out.println( "執行緒t2的名字是: "+getName());
            }
        };
        //3,在run方法體中使用Thread類的setName方法
        Thread t3=new Thread(){
            @Override
            public void run() {
                this.setName("執行緒t3");
                System.out.println( "執行緒t3的名字是: "+this.getName());
            }
        };
        t3.start();
        t1.start();
        t2.start();

        //  獲取當前執行緒物件,利用Thread中的currentThread方法
        //Runnable介面中的run方法無法直接利用getName方法,可先獲取當前物件,再利用Thread類的getName方法獲取當前執行緒名字
        Thread t4=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println( "執行緒t4的名字是: "+Thread.currentThread().getName());
            }
        },"執行緒t4");
        t4.start();
        //不設定執行緒名字,系統會預設為執行緒命名
        Thread t5=new Thread(){
            @Override
            public void run() {
                System.out.println( "執行緒t5的名字是: "+getName());
            }
        };
        t5.start();
        //設定main方法的執行緒名字並列印
        Thread.currentThread().setName("main方法");
        System.out.println( "main方法的執行緒名字是: "+Thread.currentThread().getName());
        
    }
}

參考:http://www.monkey1024.com/javase/658