建立執行緒
要了解多執行緒,肯定要先知道如何建立執行緒,建立執行緒的方式有三種,繼承 Thread 類、實現 Runnable 介面、實現 Callable 介面。
//建立執行緒方式一:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
public class TestThread1 extends Thread {
@Override
public void run() {
//run方法執行緒體
for (int i = 0; i < 20; i++) {
System.out.println("我在學習 "+i);
}
}
public static void main(String[] args) {
//main執行緒,主執行緒
//建立一個執行緒物件
TestThread1 testThread1 = new TestThread1();
//呼叫start()方法開啟方法
testThread1.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在學習多執行緒 "+i);
}
}
}
//建立執行緒方式2:實現runnable介面,重寫run方法,執行執行緒需要丟入runnable介面實現類,呼叫start方法
public class TestThread3 implements Runnable{
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在看程式碼");
}
}
public static void main(String[] args) {
//建立runnable介面的實現類物件
TestThread3 testThread3 = new TestThread3();
//建立執行緒物件,通過執行緒物件來開啟我們的執行緒,代理
Thread thread = new Thread(testThread3);
thread.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在學習多執行緒");
}
}
}
第三種通過一個下載的jar包來演示,先匯入依賴
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
//執行緒建立方式三;實現Callable介面
//先匯入一個依賴
/*
callable的好處
可以定義返回值
可以丟擲異常
*/
public class TestCallable implements Callable<Boolean> {
private String url;
private String name;
public TestCallable(String url, String name) {
this.url = url;
this.name = name;
}
public Boolean call() throws Exception {
webDownloader webDownloader = new webDownloader();
webDownloader.downloader(url,name);
System.out.println("下載了檔案為"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable t1 = new TestCallable("圖片地址", "1.jpg");
TestCallable t2 = new TestCallable("圖片地址", "2.jpg");
TestCallable t3 = new TestCallable("圖片地址", "3.jpg");
//建立執行服務:
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交執行服務
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
//獲取結果
Boolean rs1 = r1.get();
Boolean rs2 = r2.get();
Boolean rs3 = r3.get();
//關閉服務
ser.shutdownNow();
}
}
//下載器
class webDownloader{
public void downloader(String url,String name) {
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("I0異常, downloader方法出現問題");
}
}
}
執行緒不安全
死鎖條件
- 互斥條件: 一個資源每次只能被一個程式使用。
- 請求與保持條件: 一個程式因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件 :程式已獲得的資源,在末使用完之前,不能強行剝奪。
- 迴圈等待條件 :若干程式之間形成一種頭尾相接的迴圈等待資源關係。
本作品採用《CC 協議》,轉載必須註明作者和本文連結