java建立線程的方式

Java建立線程的方法有以下3種。java

1)繼承Thread類建立線程 extends Thread
2)實現Runnable接口建立線程 implements Runnable
3)實現Callable接口和Future建立線程 implements Callable
他們之間的關係以下:web

繼承Thread類建立線程

public class MyThread extends Thread {

	public MyThread() {
		super("MyThread");
	}

	@Override
	public void run() {
		long sum=0;
		for(int i=0;i<1999999999l;i++){
			sum+=i;
		}

		System.out.println(sum);
	}
}

啓動線程,即調用線程的start()或者run()方法多線程

public class Text{
	
	public static void main(String[] args) {
	
		  //第一種方式啓動線程
		  MyThread my=new MyThread();
		  my.start();

		  //第二種方式啓動線程
		  new Thread(my).start();
	}
 
}

實現Runnable接口建立線程

public class MyThread2 implements Runnable {

	private int ticket = 10;

	public MyThread2() {
		Thread.currentThread().setName("售票線程");
	}

	/**
	 * 模仿售票服務
	 */
	@Override
	public void run() {

		while (true) {
			if (ticket > 0) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				System.out.println(Thread.currentThread().getName() + "is saling...." + ticket--);
			}
		}
	}
}

啓動線程:執行start()或者run()方法ide

public class Text02 {

		public static void main(String[] args) {
			
			/*MyThread2 tt=new MyThread2();
			
			//啓動三個線程
			new Thread(tt).start();
			new Thread(tt).start();
			new Thread(tt).start();*/

			new MyThread2().run();
            new MyThread2().run();
            new MyThread2().run();
			
		}
}

實現Callable接口和Future建立線程

public class MyThread3 implements Callable<String> {

    //能夠做爲入參的接口
    public MyThread3(){
        Thread.currentThread().setName("MyThread3");
    }
    /**
     * 特色:1.具備返回值 2.能夠拋出異常
     * @return
     * @throws Exception
     */
    @Override
    public String call() throws Exception {

        return "true";
    }
}

啓動:java使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了Callable對象的call()方法的返回值。調用FutureTask對象的get()方法來得到子線程執行結束後的返回值。svg

public class Text03 {

    public static void main(String[] args) {

        MyThread3 myThread3=new MyThread3();

        //執行 Callable 方式,須要 FutureTask 實現類的支持,用於接收運算結果
        FutureTask<String> future = new FutureTask<>(myThread3);

        //啓動線程
        new Thread(future).start();

        try {
            String result = future.get();
            System.out.println("結果是--"+result);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

總結區別

一、線程只是實現Runnable或實現Callable接口,還能夠繼承其餘類。若是繼承Thread類的線程類不能再繼承其餘父類(Java單繼承決定)。注:通常推薦採用實現接口的方式來建立多線程。線程

二、實現Runnable和實現Callable接口的方式基本相同,不過是後者執行call()方法有返回值,後者線程執行體run()方法無返回值。code

相關文章
相關標籤/搜索