初识并发问题

查看代码

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方法出现问题");
        }
    }
}
posted @ 2022-04-04 19:34  Eveeee  阅读(34)  评论(0)    收藏  举报