【多线程1】程序->进程->线程 线程创建 继承Thread类 实现Runnable接口 实现Callable接口 静态代理 Lambda表达式
2026/7/13 22:05:09 网站建设 项目流程

线程


多任务

多线程

普通方法调用和多线程效率区别

程序->进程->线程


总结

线程创建

线程创建方式

继承Thread类

代码
packagecom.jiang.lesson1;//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程//总结:注意,线程开启不一定立即执行,由CPU调度执行publicclassTestThreadextendsThread{@Overridepublicvoidrun(){//run方法线程体for(inti=0;i<20;i++){System.out.println("爱你第----"+i);}}publicstaticvoidmain(String[]args){//main线程,主线程//创建一个线程对象TestThreadtestThread=newTestThread();//调用start()方法开启线程testThread.start();for(inti=0;i<20;i++){System.out.println("我在学习多线程-----"+i);}}}
结果

下载图片

代码
packagecom.jiang.lesson1;importorg.apache.commons.io.FileUtils;importjava.io.File;importjava.net.URL;//练习Thread,实现多线程同步下载图片publicclassTestThread01extendsThread{privateStringurl;//网络图片地址privateStringname;//保存的文件名publicTestThread01(Stringurl,Stringname){//构造方法this.url=url;this.name=name;}//下载图片线程的执行体@Overridepublicvoidrun(){WebDownloaderwebDownloader=newWebDownloader();webDownloader.downloader(url,name);System.out.println("下载文件名为:"+name);}publicstaticvoidmain(String[]args){TestThread01t1=newTestThread01("https://i0.hdslb.com/bfs/archive/b906001449553663f1a39a7d940fa078dc9fc5a7.jpg","1.jpg");TestThread01t2=newTestThread01("https://i0.hdslb.com/bfs/archive/bd3b4b731a45f131f4bab6e5bd453bb7cc2efcb7.jpg","2.jpg");t1.start();t2.start();}//下载器classWebDownloader{//下载方法publicvoiddownloader(Stringurl,Stringname){try{FileUtils.copyURLToFile(newURL(TestThread01.this.url),newFile(TestThread01.this.name));}catch(Exceptione){e.printStackTrace();System.out.println("IO异常");}}}}
结果

创建线程方式2:实现Runnable接口
代码
packagecom.jiang.lesson1;//创建线程方式2:实现Runnable接口,重写run方法,执行线程需要丢入runnnable接口实现类,调用start方法publicclassTestThread02implementsRunnable{@Overridepublicvoidrun(){//run方法线程体for(inti=0;i<20;i++){System.out.println("爱你第----"+i);}}publicstaticvoidmain(String[]args){//创建runnable接口的实现类对象TestThreadtestThread2=newTestThread();//创建一个线程对象,通过线程对象来开启我们的线程,代理//TestThread thread = new Thread(testThread2);//thread.start();newThread(testThread2).start();for(inti=0;i<20;i++){System.out.println("我在学习多线程-----"+i);}}}
结果


小结

买火车票
代码
packagecom.jiang.lesson1;//并发问题:此代码缺点为几个人可以抢到同样的票//多个线程同时操作一个对象//买火车票//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱publicclassTestThread04implementsRunnable{//票数privateintticktNums=10;@Overridepublicvoidrun(){while(true){if(ticktNums<=0){break;}//模拟延时try{Thread.sleep(200);//休眠}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticktNums--+"票");}}publicstaticvoidmain(String[]args){TestThread04ticket=newTestThread04();newThread(ticket,"明").start();newThread(ticket,"老师").start();newThread(ticket,"黄牛").start();}}
结果

龟兔赛跑

代码
packagecom.jiang.lesson1;//模拟龟兔赛跑publicclassRaceimplementsRunnable{//胜利者privatestaticStringwinnner;@Overridepublicvoidrun(){for(inti=0;i<=100;i++){//模拟兔子休息if(Thread.currentThread().getName().equals("兔子")&&i%10==0){try{Thread.sleep(10);}catch(Exceptione){e.printStackTrace();}}//判断比赛是否结束booleanflag=gameOver(i);//如果比赛结束了,就停止该程序if(flag){break;}System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");}}//判断是否完成比赛publicbooleangameOver(intsteps){//判断是否有胜利者if(winnner!=null){//已经存在胜利者了returntrue;}{if(steps>=100){winnner=Thread.currentThread().getName();System.out.println("winner is "+winnner);returntrue;}}returnfalse;}publicstaticvoidmain(String[]args){Racerace=newRace();newThread(race,"兔子").start();newThread(race,"乌龟").start();}}
结果

实现Callable接口(了解即可)
代码
packagecom.jiang.lesson2;importorg.apache.commons.io.FileUtils;importjava.io.File;importjava.net.URL;importjava.util.concurrent.*;publicclassTestCallableimplementsCallable<Boolean>{privateStringurl;//网络图片地址privateStringname;//保存的文件名publicTestCallable(Stringurl,Stringname){//构造方法this.url=url;this.name=name;}//下载图片线程的执行体@OverridepublicBooleancall(){WebDownloaderwebDownloader=newWebDownloader();webDownloader.downloader(url,name);System.out.println("下载文件名为:"+name);returntrue;}publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{TestCallablet1=newTestCallable("https://i0.hdslb.com/bfs/archive/b906001449553663f1a39a7d940fa078dc9fc5a7.jpg","1.jpg");TestCallablet2=newTestCallable("https://i0.hdslb.com/bfs/archive/bd3b4b731a45f131f4bab6e5bd453bb7cc2efcb7.jpg","2.jpg");//创建执行服务ExecutorServiceser=Executors.newFixedThreadPool(3);//提交执行Future<Boolean>r1=ser.submit(t1);Future<Boolean>r2=ser.submit(t2);//获取结果booleanrs1=r1.get();booleanrs2=r2.get();System.out.println(rs1);System.out.println(rs2);//关闭服务ser.shutdown();}//下载器classWebDownloader{//下载方法publicvoiddownloader(Stringurl,Stringname){try{FileUtils.copyURLToFile(newURL(TestCallable.this.url),newFile(TestCallable.this.name));}catch(Exceptione){e.printStackTrace();System.out.println("IO异常");}}}}
结果

静态代理

代码

packagecom.jiang.lesson2;//静态代理模式总结://真实对象和代理对象都要实现同一个接口//代理对象要代理真实角色//好处://代理对象可以做很多真实对象做不了的事情//真实对象专注做自己的事情publicclassStacticProxy{publicstaticvoidmain(String[]args){Youyou=newYou();//你要结婚newThread(()->System.out.println("我爱你")).start();newWeddingCompany(newYou()).HappyMarry();}}interfaceMarry{voidHappyMarry();}//真实角色,你去结婚classYouimplementsMarry{@OverridepublicvoidHappyMarry(){System.out.println("楼侠要结婚了,超开心");}}//代理角色,帮助你结婚classWeddingCompanyimplementsMarry{//代理唯一-->真实目标角色privateMarrytarget;publicWeddingCompany(Marrytarget){this.target=target;}@OverridepublicvoidHappyMarry(){before();this.target.HappyMarry();//这就是真实对象after();}privatevoidbefore(){System.out.println("结婚之前");}privatevoidafter(){System.out.println("结婚之后");}}

结果

Lambda表达式



代码(逐渐简化)

packagecom.jiang.lesson2;/* 推导Lambda表达式 */publicclassTestLambda1{//3.静态内部类staticclassLike2implementsILike{@Overridepublicvoidlambda(){System.out.println("i like lambda2");}}publicstaticvoidmain(String[]args){ILikelike=newLike();like.lambda();like=newLike2();like.lambda();//4.局部内部类classLike3implementsILike{@Overridepublicvoidlambda(){System.out.println("i like lambda3");}}like=newLike3();like.lambda();//5.匿名内部类,没有类的名称,必须借助接口或父类//一次性使用new 接口(){};like=newILike(){@Overridepublicvoidlambda(){System.out.println("i like lambda4");}};like.lambda();//6.用lambda简化like=()->{System.out.println("i like lambda5");};like.lambda();}}//1.定义一个函数式接口interfaceILike{voidlambda();//抽象方法}//2.实现类:实现接口方法 与父类不同,只是合同工,无需像子类一样继承全部父类classLikeimplementsILike{@Overridepublicvoidlambda(){System.out.println("i like lambda");}}

结果

代码(精简版)

packagecom.jiang.lesson2;publicclassTestLambda2{publicstaticvoidmain(String[]args){//lambda表示简化ILovelove=(inta)->{System.out.println("i love you-->"+a);};//简化1:参数类型love=(a)->{System.out.println("i love you-->"+a);};//简化2:简化括号love=a->{System.out.println("i love you-->"+a);};//简化3:去掉花括号love=a->System.out.println("i love you-->"+a);//总结://lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹//前提是接口为函数式接口//多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号love.love(123);}}interfaceILove{voidlove(inta);//无方法体,只是声明形参}

结果(我没把其他方法注释掉,lambda只能有一个输入所以只有一个结果)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询