1. 程式人生 > >執行緒---三種建立方式例項;以及執行緒池的使用

執行緒---三種建立方式例項;以及執行緒池的使用

1、繼承Thread類

  • 繼承Thread類,重寫run方法(即要讓執行緒進行的操作),

  • 建立執行緒例項,呼叫start()方法啟動執行緒。

import java.util.Date;

/**
 * @author: ycz
 * @date: 2018/11/25 0025 15:48
 * @description: 繼承Thread方法
 */
public class MyThread extends Thread {
    private final static int COUNT=100;
    private String name;

    public MyThread(String name) {
        this.name = name; } @Override public void run() { for (int i=0;i<COUNT;i++) { System.out.println(Thread.currentThread().getName()+"--"+name+"---"+ new Date()); } } public static void main(String[] args) { MyThread p1 = new MyThread("zero"); MyThread p2 = new MyThread("one"); p1.start(); p2.start(); } }

 

2、實現runable介面

  • 實現runable介面,重寫run方法;

  • 建立Runnable實現類的例項,並以此例項作為Thread的target物件,即該Thread物件才是真正的執行緒物件。

import java.util.Date;

/**
* @author: ycz
* @date: 2018/11/25 0025 16:02
* @description: 實現runable方法
*/
public class MyThread2 implements Runnable {
private final static int COUNT=100;
private String name;

public MyThread2(String name) {
this.name = name;
}

@Override
public void run() {
for (int i=0;i<COUNT;i++) {
System.out.println(Thread.currentThread().getName()+"--"+name+"---"+ new Date());
}
}
public static void main(String[] args) {
Runnable runnable = new MyThread2("zero");
Thread p1 = new Thread(runnable);
p1.start();
Runnable runnable2 = new MyThread2("one");
Thread p2 = new Thread(runnable2);
p2.start();
}
}

 

 

 

3、實現callable介面

  • 實現callable介面重寫call()方法,該方法為執行緒進行的操作,並且具有返回值

  • 建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。

  •  使用FutureTask物件作為Thread物件的target建立並啟動新執行緒。

  • 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值其中: 

 

import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
* @author: ycz
* @date: 2018/11/25 0025 16:17
* @description:
*/
public class MyThread3 implements Callable {
private final static int COUNT=100;
private String name;
public MyThread3(String name) {
this.name = name;
}

/**
* 重寫call()方法;返回1~100的和
* @return
* @throws Exception
*/
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i=0;i<COUNT;i++) {
System.out.println(Thread.currentThread().getName()+"--"+name+"---"+ new Date());
sum += i;
}
return sum;
}

public static void main(String[] args) {
//建立callable()例項化物件
MyThread3 p1 = new MyThread3("zero");
//使用FutureTask類來包裝Callable物件
FutureTask<Integer> futureTask = new FutureTask<Integer>(p1);
//使用FutureTask物件作為Thread物件的target建立並啟動新執行緒
new Thread(futureTask).start();
Integer sum;
MyThread3 p2 = new MyThread3("one");
FutureTask<Integer> futureTask1 = new FutureTask<Integer>(p2);
new Thread(futureTask1).start();
Integer sum1;
try {
//等所有執行緒執行完,獲取值,因此FutureTask 可用於 閉鎖
sum = futureTask.get();
System.out.println("sum:"+sum);
sum1 = futureTask1.get();
System.out.println("sum1:"+sum1);
}catch (Exception e ){
e.printStackTrace();
}
}
}

參考:https://www.cnblogs.com/snow-flower/p/6114765.html