1. 程式人生 > 遊戲 >電影風格平臺冒險遊戲《鹿與男孩》上架Steam

電影風格平臺冒險遊戲《鹿與男孩》上架Steam

一、繼承Thread類建立

通過繼承Thread並且重寫其run(),run方法中即執行緒執行任務。建立後的子類通過呼叫 start() 方法即可執行執行緒方法。

通過繼承Thread實現的執行緒類,多個執行緒間無法共享執行緒類的例項變數。(需要建立不同Thread物件,自然不共享)

例子:

/**
 * 通過繼承Thread實現執行緒
 */
public class ThreadTest extends Thread{
  private int i = 0 ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() 
+ " is running " + i ); } } public static void main(String[] args) { for(int j=0;j<50;j++){if(j=20){ new ThreadTest().start() ; new ThreadTest().start() ; } } } }

二、 通過Runnable介面建立執行緒類

該方法需要先 定義一個類實現Runnable介面,並重寫該介面的 run() 方法,此run方法是執行緒執行體。

接著建立 Runnable實現類的物件,作為建立Thread物件的引數target,此Thread物件才是真正的執行緒物件。通過實現Runnable介面的執行緒類,是互相共享資源的。

/**
 * 通過實現Runnable介面實現的執行緒類
 */
public class RunnableTest implements Runnable {
    private int i ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() 
+ " -- " + i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " -- " + i); if(i==20){ RunnableTest runnableTest = new RunnableTest() ; new Thread(runnableTest,"執行緒1").start() ; new Thread(runnableTest,"執行緒2").start() ; } } } }

三、 使用Callable和Future建立執行緒

從繼承Thread類和實現Runnable介面可以看出,上述兩種方法都不能有返回值,且不能宣告丟擲異常。而Callable介面則實現了此兩點,Callable介面如同Runable介面的升級版,其提供的call()方法將作為執行緒的執行體,同時允許有返回值。

但是Callable物件不能直接作為Thread物件的target,因為Callable介面是 Java 5 新增的介面,不是Runnable介面的子介面。

對於這個問題的解決方案,就引入 Future介面,此介面可以接受call() 的返回值,Future介面是Runnable介面的子介面,可以作為Thread物件的target 。並且, Future 介面提供了一個實現類:FutureTask 。
FutureTask實現了Future介面、Runnable介面 ,可以作為 Thread物件的target。
  關係如下:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因為Callable介面是函式式介面,可以使用Lambda表示式
        FutureTask task = new FutureTask((Callable)()->{
          int i = 0 ;
           for(;i<100;i++){
               System.out.println(Thread.currentThread().getName() + "的迴圈變數i的值 :" + i);
           }
           return i;
        });
       for(int i=0;i<100;i++){
           System.out.println(Thread.currentThread().getName()+" 的迴圈變數i : + i");
           if(i==20){
              new Thread(task,"有返回值的執行緒").start();
          }
       }
       try{
           System.out.println("子執行緒返回值 : " + task.get());
        }catch (Exception e){
           e.printStackTrace();
        }
    }
}

參考:https://www.php.cn/java-article-410783.html