從零開始構建自己的一個網站:一:我們是如何訪問網站的
阿新 • • 發佈:2022-04-13
Process 和 Tread
建立多執行緒方法一
1 package main.com; 2 3 4 //建立程序方法一:繼承 Thread 類,重寫 run() 方法,呼叫 start() 方法開啟執行緒 5 6 //總結:注意,執行緒開啟不一定立即執行由 CPU 排程執行 7 public class TestThread1 extends Thread{ 8 9 @Override 10 public void run(){ 11 //run 方法執行緒體 12 for (int i = 0; i < 20; i++) {13 System.out.println("runing..." + i); 14 } 15 16 } 17 18 public static void main(String[] args) { 19 //main 執行緒,即主執行緒 20 21 TestThread1 tt1 = new TestThread1(); 22 //呼叫start() 方法開啟執行緒 23 tt1.start(); 24 25 for (int i = 0; i < 200; i++) {26 System.out.println("main....." + i); 27 } 28 29 } 30 }
實踐
1 package com.xun; 2 3 import org.apache.commons.io.FileUtils; 4 5 import java.io.File; 6 import java.io.IOException; 7 import java.net.URL; 8 9 //練習Thread,實現多執行緒同步下載圖片 10 public class TestThread2 extends同步下載圖片Thread{ 11 private String url; //網路圖片地址 12 private String name; //儲存的檔名 13 14 public TestThread2(String url,String name){ 15 this.url = url; 16 this.name = name; 17 } 18 19 @Override 20 public void run(){ 21 WebDownloder webDownloder = new WebDownloder(); 22 webDownloder.downloader(url,name); 23 System.out.println("下載檔名為"+name); 24 } 25 26 public static void main(String[] args) { 27 TestThread2 t1 = new TestThread2("http://www.ikuimg.com/img/pic/2203/1-220331105120-p9.jpg","1.jpg"); 28 TestThread2 t2 = new TestThread2("http://www.ikuimg.com/img/pic/2203/1-220331105121-p9.jpg","2.jpg"); 29 TestThread2 t3 = new TestThread2("http://www.ikuimg.com/img/pic/2203/1-220331105122-p9.jpg","3.jpg"); 30 31 t1.start(); 32 t2.start(); 33 t3.start(); 34 35 } 36 } 37 38 //下載器 39 class WebDownloder{ 40 public void downloader(String link, String name){ 41 try { 42 URL url = new URL(link); 43 //url.openConnection().setRequestProperty("User-Agent", "Mozilla/4.76"); 44 FileUtils.copyURLToFile(url,new File(name)); 45 } catch (IOException e) { 46 e.printStackTrace(); 47 System.out.println("IO異常,downloder方法異常"); 48 } 49 } 50 }
建立多執行緒方法二:
1 package com.xun; 2 3 //建立執行緒方式2:實現 runable 介面,重寫run方法,實行執行緒需要丟入 runable 介面實現類,呼叫start 方法 4 5 public class TestThread3 implements Runnable{ 6 @Override 7 public void run(){ 8 //run 方法呼叫執行緒體 9 for (int i = 0; i < 20; i++) { 10 System.out.println("runing..."); 11 } 12 } 13 14 public static void main(String[] args) { 15 //main 執行緒,即主執行緒 16 17 TestThread3 tt3 = new TestThread3(); 18 19 //建立執行緒物件,通過執行緒物件來開啟我們的執行緒 20 // Thread thread = new Thread(tt3); 21 // tt3.start(); 22 23 new Thread(tt3).start(); 24 for (int i = 0; i < 200; i++) { 25 System.out.println("main....." + i); 26 } 27 28 } 29 }
小結:
繼承Thread類:
子類繼承Thread類具備多執行緒能力
啟動執行緒:子類物件.start()
不建議使用:避免OOP單繼承侷限性
實現Runable介面
實現介面Runable具有多執行緒能力
啟動執行緒:傳入目標物件+Thread物件.start()
推薦使用:避免單繼承侷限性,靈活方便,方便同一個物件被多個執行緒使用
例項,初識併發
1 package com.xun; 2 3 //發現問題,多個執行緒操作同一個資源,執行緒不安全,資料紊亂,併發問題 4 public class TestThread4 implements Runnable{ 5 6 private int ticketNums = 10; //票數 7 8 @Override 9 public void run(){ 10 while(ticketNums>0){ 11 try { 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"張票"); 17 } 18 } 19 20 public static void main(String[] args) { 21 TestThread4 tt4 = new TestThread4(); 22 23 new Thread(tt4,"張三").start(); 24 new Thread(tt4,"李四").start(); 25 new Thread(tt4,"王五").start(); 26 } 27 }
例項:龜兔賽跑,一個物件,多個執行緒使用
1 package com.xun; 2 3 //發現問題,多個執行緒操作同一個資源,執行緒不安全,資料紊亂,併發問題 4 public class TestThread4 implements Runnable{ 5 6 private int ticketNums = 10; //票數 7 8 @Override 9 public void run(){ 10 while(ticketNums>0){ 11 try { 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"張票"); 17 } 18 } 19 20 public static void main(String[] args) { 21 TestThread4 tt4 = new TestThread4(); 22 23 new Thread(tt4,"張三").start(); 24 new Thread(tt4,"李四").start(); 25 new Thread(tt4,"王五").start(); 26 } 27 }View Code