轉載自品略圖書館 http://www.pinlue.com/article/2020/05/2102/3810573725857.html
Java SE進階開發——多線程的實作
程序與線程的概念:
程序:作業系統中,一個程式的執行周期稱為一個程序
線程:一個程式同時執行多個任務的時候,我們把每一任務稱作一個線程
程序與線程相比較,線程更”輕量級“,建立、撤銷一個線程比啟動一個程序開銷要小的多。但是,沒有程序就沒有線程,程序一旦終止,其内的線程也不再存在。
多線程與多程序的差別:
每個程序都擁有自己的完整變量,而線程之間則共享資料。共享資料使得線程間通信更加友善、有效。
多線程實作:
1、繼承Thread類實作多線程
class MyThread extends Thread{//定義線程主體類 private String title; public MyThread(String title){ this.title = title; } @Override public void run(){ for(int i = 0; i < 10; i ){ System.out.println(this.title " i = " i); } }}public class ThreadTest { public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1");//建立新線程 MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); myThread1.run();//啟動線程 myThread2.run(); myThread3.run(); }}
運作結果:
由運作結果可以看出,此時線程隻是按順序列印,并沒有多線程的共享資料的性質,所有我們要特别注意:啟動線程需要使用start()方法。
public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1"); MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); myThread1.start(); myThread2.start(); myThread3.start();}
此時線程變為交替執行
2、Runable實作多線程
class MyThread implements Runnable{ private String title; public MyThread(String title){ this.title = title; } @Override public void run() { for(int i = 0; i < 10; i ){ System.out.println(this.title " i = " i); } }}public class ThreadTest { public static void main(String[] args) { MyThread myThread1 = new MyThread("線程1"); MyThread myThread2 = new MyThread("線程2"); MyThread myThread3 = new MyThread("線程3"); new Thread(myThread1).start(); new Thread(myThread2).start(); new Thread(myThread3).start(); }}
注意:實作Runnable接口比繼承Thread類所具有的優勢:
a、從形式上來說,可以避免Java中的單繼承局限
b、使用Runnable實作的多線程的程式類可以更好的描述出程式共享的概念
3、Callable實作多線程
class MyThread implements Callable<String>{ private int tickets = 10; @Override public String call() throws Exception { while (this.tickets >= 0){ System.out.println("剩餘票數為:" this.tickets--); } return "票賣完了"; }}public class ThreadTest { public static void main(String[] args) throws InterruptedException,ExecutionException { FutureTask<String> task = new FutureTask<>(new MyThread()); new Thread(task).start(); new Thread(task).start(); System.out.println(task.get()); }}
通過繼承Callable來實作多線程的特點:可以取得線程執行結果,具有傳回值