執行緒建立的三種方法
阿新 • • 發佈:2022-05-28
1.第一種
-
package com.yang.thread;
/*
[1] 繼承Thread類,重寫run方法
[2] 使用start() 開啟子執行緒
[3] 我們呼叫start(),底層呼叫的是start0(),底層不是java書寫的--->run().
*/
//執行緒實現的第一種方式
public class Thread01 {
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.setName("兔子");//給執行緒設定名字
threadTest.start();//開啟執行緒
ThreadTest threadTest1 = new ThreadTest();
threadTest1.setName("烏龜");
threadTest1.start();
}
}
class ThreadTest extends Thread{//繼承執行緒
package com.yang.thread;
public class Thread02 {
public static void main(String[] args) {
//匿名內部類
Thread thread = new Thread(){
2.第二種
package com.yang.thread;
//建立執行緒的第二種方法
/*
實現Runnable介面,重寫run方法。
直接呼叫start()不可以開啟執行緒。需要使用Thread有參構造進行開啟執行緒。
*/
public class Thread03 {
public static void main(String[] args) {
//建立兩個物件,和建立一個物件的區別在於資源是否共享。
MyThread my = new MyThread();
MyThread my1 = new MyThread();
Thread t = new Thread(my,"兔子");
Thread t1 = new Thread(my1,"烏龜");
t.start();
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
有三個執行緒,一個主執行緒main,還有兩個子執行緒,,他們都是同時執行的。只是有主執行緒執行的快,所以先輸出完。
*/
System.out.println("我在輸出語句了");
}
}
class MyThread implements Runnable{
package com.yang.thread;
public class Thread04 {
public static void main(String[] args) {
//使用匿名內部類
new Thread(new Runnable() {
3.第三種
package com.yang.thread;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//實現執行緒的第三種方式
//實現Callable
/*
可以有返回值
*/
//底層原理
//start() --> start0()-->run()->FutureTask 中的run()方法中調的是-->result = c.call()-->set(result)
// -->outcome = v返回值-->get()得到返回值。
public class Demo05 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable my = new MyCallable();
MyCallable my1 = new MyCallable();//這個一般寫兩個;主要看資源是不是共享
// FutureTask(Callable<V> callable)--->FutureTask<V> implements RunnableFuture<V>--->RunnableFuture<V> extends Runnable
//相等於一箇中間轉換FutureTask
//這是開啟了兩個執行緒
FutureTask<Integer> task = new FutureTask<>(my);
FutureTask<Integer> task1 = new FutureTask<>(my1);
Thread thread = new Thread(task,"兔子");
Thread thread1 = new Thread(task,"兔子");
thread.start();
thread1.start();
//獲得當前執行緒結束後的返回值。thread.start();不能寫在這之後,理解一下。
Integer integer = task.get();
Integer integer1 = task1.get();
System.out.println(integer);
System.out.println(integer1);
}
}
class MyCallable implements Callable<Integer> {
package com.yang.thread;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Demo06 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
總結
-
後兩種方式可以避免Java中的單繼承的侷限性
-
需要返回值只能使用想實現Callable介面
-
不需要返回值推薦使用Runnable介面
-