1. 程式人生 > >Thread (執行緒)

Thread (執行緒)

Thread

使用新執行緒的步驟:

  1. 通過覆寫 Thread 的 run 方法,配置新執行緒需要做的事情
  2. 建立新執行緒物件 new YourThread()
  3. 開啟執行緒 start

建立新執行緒的方法有很多,下面是一個示例:

class MyThread extends Thread {
    @Override
    public void run () {
        System.out.println("在新的執行緒內執行的任務。這任務是獨立的,不會影響主執行緒程式碼執行。");
    }
}
public class Main { public static void main (String... args) { Thread myThread = new MyThread(); // 建立執行緒 mythread.start(); // 執行執行緒 } }

也可以這樣:

class MyThread implements Runnable {
    @Override
    public void run () {
        System.out.println("在新的執行緒內執行的任務。這任務是獨立的,不會影響主執行緒程式碼執行。");
    }
}
public class Main { public static void main (String... args) { Thread myThread = new Thread(new MyThread()); // 建立執行緒 mythread.start(); // 執行執行緒 } }

上面程式碼可以簡寫為:

// 使用匿名內部類進行簡化
public class Main {
    public static void main (String... args) {
        Thread myThread 
= new Thread () { @Override public void run () { System.out.println("在新的執行緒內執行的任務。這任務是獨立的,不會影響主執行緒程式碼執行。"); } }; myThread.start(); } }

使用 jdk8 的語法,甚至可以簡化為:

public class Main {
    public static void main (String... args) {
        new Thread(() -> System.out.println("task")).start();
    }
}

其他:

t.join()
讓當前執行緒阻塞並等待執行緒 t 結束再執行接下來程式碼
Thread.sleep()
讓當前執行緒暫時休眠 n 毫秒,這過程不會釋放所佔用的物件鎖
Thread.yield()
暫時退讓,優先讓其他執行緒先執行。如果沒有執行緒在這個過程中搶佔執行權,則繼續執行
Executors 是一個常用的靜態類,內建了很多執行緒池相關的操作。

執行緒池使用的基本語法:

// 1. 建立執行緒池
ExecutorService service = Executors.newCachedThreadPool();

// 2. 建立任務
Runnable task = new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread());
        }
    };

// 3. 使用執行緒池排程任務
for (int i = 0; i < 1000; i++) {
    service.execute(task);
}

// 4. 關閉執行緒池
service.shutdown();

可以簡化為:

ExecutorService service = Executors.newCachedThreadPool();

for (int i = 0; i < count; i++) {
    service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread());
            }
        });
}

可以進一步簡化為(jdk8語法):

ExecutorService service = Executors.newCachedThreadPool();

for (int i = 0; i < count; i++) {
    service.execute(() -> System.out.println(Thread.currentThread()));
}