线程创建
-
继承Thread类
package com.yeyue.demo01; //创建线程方式一:继承Thread类,重写run()方法,调用start开启线程 //线程开始不一定立即执行,由cpu调度 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 < 100; i++) { System.out.println("我在学习多线程----" + i); } } }
-
实现Runnable接口
多线程下载图片
package com.yeyue.demo01; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; //练习Thread,实现多线程同步下载图片 public class TestThread2 implements Runnable { private String url; //图片下载的url private String name; //下载的图片保存的图片名字 public TestThread2(String url,String name){ this.url = url; this.name = name; } //下载图片的执行体 @Override public void run() { WebDownloader webDownloader = new WebDownloader(); webDownloader.downloader(url,name); System.out.println("下载了文件名:" + name); } public static void main(String[] args) { TestThread2 t1 = new TestThread2("https://img2.baidu.com/it/u=2253502056,189588800&fm=26&fmt=auto&gp=0.jpg","1.jpg"); TestThread2 t2 = new TestThread2("https://img2.baidu.com/it/u=3529414605,308711291&fm=26&fmt=auto&gp=0.jpg","2.jpg"); TestThread2 t3 = new TestThread2("https://img1.baidu.com/it/u=1863405005,3705892836&fm=26&fmt=auto&gp=0.jpg","3.jpg"); new Thread(t1).start(); new Thread(t2).start(); new Thread(t3).start(); } } //下载器 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("IO异常,downloader方法出现问题"); } } }
买票
package com.yeyue.demo01; //多个线程同时操作一个对象 //买火车票的例子 //多个线程操作同一个资源的情况下,资源不安全了 public class TestThread4 implements Runnable { //票数 private int ticketNums =10; @Override public void run() { while (true){ if(ticketNums <= 0){ break; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketNums--+"票"); } } public static void main(String[] args) { TestThread4 ticket = new TestThread4(); new Thread(ticket,"小明").start(); new Thread(ticket,"老师").start(); new Thread(ticket,"黄牛党").start(); } }
-
实现Callable接口
package com.yeyue.demo01; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.concurrent.*; public class TestCallable implements Callable<Boolean> { private String url; //图片下载的url private String name; //下载的图片保存的图片名字 public TestCallable(String url,String name){ this.url = url; this.name = name; } //下载图片的执行体 @Override public Boolean call() { WebDownloader1 webDownloader1 = new WebDownloader1(); webDownloader1.downloader1(url,name); System.out.println("下载了文件名:" + name); return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { TestCallable t1 = new TestCallable("https://img2.baidu.com/it/u=2253502056,189588800&fm=26&fmt=auto&gp=0.jpg","1.jpg"); TestCallable t2 = new TestCallable("https://img2.baidu.com/it/u=3529414605,308711291&fm=26&fmt=auto&gp=0.jpg","2.jpg"); TestCallable t3 = new TestCallable("https://img1.baidu.com/it/u=1863405005,3705892836&fm=26&fmt=auto&gp=0.jpg","3.jpg"); //创建执行服务 ExecutorService ser = (ExecutorService) 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(); System.out.println(rs1); System.out.println(rs2); System.out.println(rs3); //关闭服务 ser.shutdownNow(); } } //下载器 class WebDownloader1 { //下载方法 public void downloader1(String url, String name) { try { FileUtils.copyURLToFile(new URL(url), new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloader方法出现问题"); } } }
-
模拟龟兔赛跑
package com.yeyue.demo01; //模拟龟兔赛跑 public class Race implements Runnable{ private static String winner; @Override public void run() { for (int i = 0; i <= 100; i++) { if(Thread.currentThread().getName().equals("兔子") && i%10==0){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } //判断游戏是否结束 boolean flag = gameOver(i); if(flag){ break; } System.out.println(Thread.currentThread().getName()+"跑了"+i+"步"); } } private boolean gameOver(int steps){ if(winner!=null){ return true; }{ if(steps>=100){ winner = Thread.currentThread().getName(); System.out.println("winner is " + winner); return true; } } return false; } public static void main(String[] args) { Race race = new Race(); new Thread(race,"兔子").start(); new Thread(race,"乌龟").start(); } }