【Java多线程】创建多线程的三种方式
生活随笔
收集整理的這篇文章主要介紹了
【Java多线程】创建多线程的三种方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、我的第一個多線程程序
方法一: extends Thread
package cn.hanquan.test;public class StartThread extends Thread {@Overridepublic void run() {// 線程入口點for (int i = 0; i < 2000; i++) {System.out.println("偷偷敲代碼");}}public static void main(String[] args) {/** 啟動線程* 1、創建子類對象* 2、調用子類對象的start方法*/StartThread st=new StartThread();st.start();for (int i = 0; i < 2000; i++) {System.out.println("吃飯");}} }
方法二:implements Runnable(推薦)
方法三:implements Callable(了解)
功能:多線程下載網頁圖片
package cn.hanquan.test;import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;import org.apache.commons.io.FileUtils;public class TDownloader implements Callable<Boolean> {private String url;private String name;// 構造器public TDownloader(String url, String name) {this.url = url;this.name = name;}// 線程入口點@Overridepublic Boolean call() {WebDownloader.download(url, name);System.out.println("success");return true;}public static void main(String[] args) throws InterruptedException, ExecutionException {TDownloader cd1 = new TDownloader("https://img-blog.csdnimg.cn/20190724224219516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzQyNDgzMzQx,size_16,color_FFFFFF,t_70","1.png");TDownloader cd2 = new TDownloader("https://www.bjsxt.com/wp-content/themes/sxt/statics/images/bjsxt/images/share/project2.png", "2.png");TDownloader cd3 = new TDownloader("https://img-blog.csdnimg.cn/20190722092922681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzQyNDgzMzQx,size_16,color_FFFFFF,t_70","3.png");// 創建執行服務ExecutorService ser = Executors.newFixedThreadPool(3);// 提交執行Future<Boolean> result1 = ser.submit(cd1);Future<Boolean> result2 = ser.submit(cd2);Future<Boolean> result3 = ser.submit(cd3);// 獲取結果boolean r1 = result1.get();boolean r2 = result2.get();boolean r3 = result3.get();// 關閉服務ser.shutdownNow();} }//下載工具 class WebDownloader {public static void download(String url, String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }運行結果:可以看到,圖片成功被下載
2、多線程下載圖片
需要使用commons.io
package cn.hanquan.test;import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL;import org.apache.commons.io.FileUtils;public class TDownloader extends Thread {private String url;private String name;// 構造器public TDownloader(String url, String name) {this.url = url;this.name = name;}// 線程入口點@Overridepublic void run() {WebDownloader.download(url, name);System.out.println("success");}public static void main(String[] args) {TDownloader t1 = new TDownloader("https://img-blog.csdnimg.cn/20190724224219516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzQyNDgzMzQx,size_16,color_FFFFFF,t_70","1.png");TDownloader t2 = new TDownloader("https://www.bjsxt.com/wp-content/themes/sxt/statics/images/bjsxt/images/share/project2.png", "2.png");TDownloader t3 = new TDownloader("https://img-blog.csdnimg.cn/20190722092922681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzQyNDgzMzQx,size_16,color_FFFFFF,t_70","3.png");t1.start();t2.start();t3.start();} }//下載工具 class WebDownloader {public static void download(String url, String name) {try {FileUtils.copyURLToFile(new URL(url), new File(name));} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }3.使用多線程模擬搶票
出現重復數字的原因是:線程不安全
package cn.hanquan.test;public class StartRun implements Runnable {public static int ticket = 100;// 線程入口點@Overridepublic void run() {while (ticket > 0) {//ticket--;System.out.println(Thread.currentThread().getName() + "->" + ticket--);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {// 三合一:如果一個對象只是用一次,我們可以使用匿名new Thread(new StartRun(), "小紅").start();new Thread(new StartRun(), "魔鬼").start();new Thread(new StartRun(), "布谷鳥").start();} }部分結果
總結
以上是生活随笔為你收集整理的【Java多线程】创建多线程的三种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java文件操作(八)】将控制台输出重
- 下一篇: 【Android开发】我的第一个安卓程序