初识并发问题
查看代码
package com.lei.study; //多个线程同时操作同一个对象 //买火车票例子 public class Thread2 implements Runnable { //票数 private int ticketNum=10; @Override public void run() { while (true){ if(ticketNum<=0){ break; } //模拟延时 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"抢到了第"+ticketNum--+"张票!"); } } public static void main(String[] args) { Thread2 thread2 = new Thread2(); new Thread(thread2,"小明").start(); new Thread(thread2,"狂神").start(); new Thread(thread2,"Eve").start(); } }
问题:同时抢到了同一张票,导致数据紊乱
龟兔赛跑
package com.lei.study; public class Race implements Runnable { //龟兔赛跑胜利者 private static String winner; @Override public void run() { //跑一百步比赛结束 for (int i = 1; i <= 100; i++) { //模拟兔子休息 if(Thread.currentThread().getName().equals("兔子")&&i%10==0){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } //判断比赛是否结束 boolean flag=gameOver(i); if (flag){ break; } System.out.println(Thread.currentThread().getName()+"已经跑了"+i+"步!"); } } public boolean gameOver(int i){ if (winner!=null){//如果省略这一步,将出现两个winner return true; } if (i==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(); } }
Callable
package com.lei.study02; import com.lei.study.Thread1; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.concurrent.*; public class TestThread implements Callable<Boolean> { private String url; //网络图片地址 private String name; //保存的文件名 public TestThread(String url,String name){ this.url=url; this.name=name; } //下载图片的执行体 @Override public Boolean call() { WebDownloader webDownloader = new WebDownloader(); webDownloader.downloader(url,name); System.out.println("下载了文件名为:"+name); return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { TestThread t3=new TestThread("https://img2022.cnblogs.com/blog/2696501/202204/2696501-20220404143439429-968657608.png","图片3"); //创建执行服务 ExecutorService ser= Executors.newFixedThreadPool(1); //提交执行 Future<Boolean> r1=ser.submit(t3); //获取结果 boolean rs1=r1.get(); //打印返回值 System.out.println(rs1); //关闭服务 ser.shutdown(); } } //下载器 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方法出现问题"); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通