线程
多线程
三种线程创建方式
-
继承Thread 重写run()方法
子类继承Thread类具备多线程能力
启动:之类对象.start()
不建议使用:避免oop单继承局限性
package demo02; //创建线程方式一:1.继承Thread类 2.重写run()方法 3.调用strat方法 //线程开启不一定立即执行,由CPU调度执行 public class Demo02 extends Thread { @Override public void run() { //run方法体线程 for (int i = 0; i < 20; i++) { System.out.println("我在执行run方法体线程" + i); } } public static void main(String[] args) { //main方法体线程 //创建一个线程对象 Demo02 demo02 =new Demo02(); //调用start()方法开启线程 demo02.start(); // demo02.run() for (int i = 0; i < 200; i++) { System.out.println("我在学习线程代码" + i); } } } -
实现Runnable 重写run()方法
实现接口Runnable具备多线程能力
传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,同一个对象被多个线程使用
package demo02; //创建线程的第二种方式 //实现Runnable接口 //实现run()方法 //调用start()方法启动线程 public class Demo04 implements Runnable{ @Override public void run() { //run方法体线程 for (int i = 0; i < 20; i++) { System.out.println("我在执行run方法体线程" + i); } } public static void main(String[] args) { //main方法体线程 //创建Runnable接口的实现类对象 Demo04 demo04 =new Demo04(); //创建线程对象通过线程对象来开启线程代理 Thread thread=new Thread(demo04); thread.start(); //可整合为如下代码 //new Thread(demo04).start(); for (int i = 0; i < 200; i++) { System.out.println("我在学习线程代码" + i); } } } -
实现Callable接口 重写call()方法,需抛出异常
创建执行服务
提交执行
获取结果
关闭服务
package demo02; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.concurrent.*; //创建线程的第三种方式 实现Callable 重写call()方法 好处:可获取返回值 ,可抛出异常 //1.创建服务 2.提交执行 3.获取返回值 4.结束服务 public class Demo7 implements Callable<Boolean> { private String url; //网络图片地址 private String name; //保存的文件名 public Demo7(String url,String name){ this.url=url; this.name=name; } //下载图片线程的执行体 @Override public Boolean call() { WebDownloder1 webDownloder= new WebDownloder1(); webDownloder.downloder(url,name); System.out.println("下载了名字为"+name+"的图片"); return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { //路线一 Demo7 demo01 =new Demo7("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg","0.jpg"); //路线二 Demo7 demo02 =new Demo7("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1730713693,2130926401&fm=26&gp=0.jpg","1.jpg"); //路线三 Demo7 demo03 =new Demo7("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618558782&t=d166699d2a0f1d186ba42782ecee1cb6","2.jpg"); //创建执行服务 ExecutorService service= Executors.newFixedThreadPool(3); //提交执行 Future<Boolean> res1=service.submit(demo01); Future<Boolean> res2=service.submit(demo02); Future<Boolean> res3=service.submit(demo03); //获取结果 boolean r1=res1.get(); boolean r2=res2.get(); boolean r3=res3.get(); System.out.println(r1); System.out.println(r2); System.out.println(r3); //关闭服务 service.shutdownNow(); } } //下载器 class WebDownloder1{ //下载方法 public void downloder(String url, String name){ try { FileUtils.copyURLToFile(new URL(url),new File(name)); //导入FileUtils包 } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloder方法出现问题"); } } }
Thread 实现多线程同步下载图片
package demo02;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//练习Thread 实现多线程同步下载图片 lib引入commons-io 的jar包
public class Demo03 extends Thread{
private String url; //网络图片地址
private String name; //保存的文件名
public Demo03(String url,String name){
this.url=url;
this.name=name;
}
//下载图片线程的执行体
@Override
public void run() {
WebDownloder webDownloder= new WebDownloder();
webDownloder.downloder(url,name);
System.out.println("下载了名字为"+name+"的图片");
}
public static void main(String[] args) {
//路线一
Demo03 demo01 =new Demo03("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg","0.jpg");
//路线二
Demo03 demo02 =new Demo03("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1730713693,2130926401&fm=26&gp=0.jpg","1.jpg");
//路线三
Demo03 demo03 =new Demo03("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618558782&t=d166699d2a0f1d186ba42782ecee1cb6","2.jpg");
demo01.start();
demo02.start();
demo03.start();
}
}
//下载器
class WebDownloder{
//下载方法
public void downloder(String url, String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name)); //导入FileUtils包
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloder方法出现问题");
}
}
}
简单的静态代理
package demo02;
//静态代理模式
//代理模式 真实对象和代理对象要实现同一个接口 代理对象要代理真实对象
//好处。代理对象可以做很多真实对象做不了的事情 真实对象可专注做自己的事情
public class Demo08 {
public static void main(String[] args) {
WeddingCompany weddingCompany= new WeddingCompany(new You());
weddingCompany.HappyMarry();
}
}
//接口
interface Marry{
void HappyMarry();
}
//真实角色
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("八戒要结婚了,好开心啊");
}
}
//代理角色
class WeddingCompany implements Marry{
//代理 ----》真实目标
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
befor();
this.target.HappyMarry(); //真实对象结婚
after();
}
private void after() { //代理对象完成的其他事情
System.out.println("收尾款");
}
private void befor() { //代理对象完成的其他的事情
System.out.println("布置现场");
}
}

浙公网安备 33010602011771号