執行緒---三種建立方式例項;以及執行緒池的使用
阿新 • • 發佈:2018-11-28
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